2010-09-19 12 views
5

Me gustaría saber en qué escenarios utiliza la encapsulación. El propósito de esta pregunta es colaborativo. Así que siéntete libre de compartir tu propia experiencia cuando el tema esté encapsulado.¿En qué escenarios usa encapsulación?

Algunos escenarios:

propiedad calculada

public class Order { 

    private List<ListItem> listItems = new ArrayList<ListItem>(); 

    public double getTotal() { 
     double total = 0; 
     for(ListItem listItem: listItems) 
      total += listItem.getQuantity() * listItem.getPropduct().getPrice(); 

     return total; 
    } 

} 

objetos de dominio autovalidante

public class Person { 

    private String name; 

    public void setName(String name) { 
     if(StringUtils.isBlank(name)) { 
      throw new NotEmptyException("name", name); 
     } 

     this.name = name; 
    } 

} 

Hace uso de otro tipo de clases por algún comportamiento especial

public class Person { 

    private MutableInt id = new MutableInt(); 

    /** 
     * Integer itself is immutable 
     */ 
    public Integer getId() { 
     retur id.intValue(); 
    } 

} 

Conversión

public class Person { 

    public String enabled; 

    public boolean isEnabled() { 
     return "Y".equals(enabled); 
    } 

} 
+1

Su método 'isEnabled' puede acortarse a' return 'Y' .equals (habilitado); '. – whiskeysierra

Respuesta

4

Simplemente, yo prefiero usar una fuerte encapsulación en todos API no privados que diseño/implementación.

El único caso en el que habitualmente no utilizan la encapsulación es fuerte con clases anidadas privadas que son (y deben ser) un poco más que sucedáneos struct declaraciones. Mi razonamiento es que la clase privada está suficientemente encapsulada por estar anidada y privada.

También estoy preparado para relajar la encapsulación (un poco) si hay razones convincentes de rendimiento para hacer esto. Esta relajación generalmente consiste en filtrar arreglos/colecciones internas cuando el costo de copiarlas es prohibitivo. Y siempre me hace sentir incómodo al hacer esto ...

+1

+1. Encapsulación en TODOS los escenarios, a menos que sea realmente prohibitiva ... – Nivas

+0

+1 Nivas. re: struct. Me parece que cada vez que uso una estructura en lugar de una clase, termino teniendo que arrancar la estructura más tarde y reemplazarla con una clase de todos modos. re: rendimiento. los problemas de rendimiento en mi código involucran el acceso a la base de datos el 99% del tiempo. Nunca he tenido un problema de rendimiento causado por un código Java simple. –

0

Encapsulado cuando hay un escenario en el que el usuario puede arruinarlo. Por ejemplo, si estuviera escribiendo una clase que mostrara texto, no encapsularía el hecho de que tengo una cadena, porque cualquier cadena es válida para mostrar.

Existe encapsulación para validación y cambio de interfaz. Si tiene un parámetro que no necesita validación (y la interfaz está bien definida), no tiene sentido encapsularlo, especialmente si utiliza un lenguaje que no incluye ninguna herramienta incorporada, como Java (herramientas). siendo, por ejemplo, propiedades de C#).

La encapsulación es una herramienta como cualquier otra y no se debe tirar por todos lados solo porque se puede.