2011-03-29 23 views
6

Por qué la visibilidad paquete de utilización (por defecto), a menos que la clase debe ser público en Javapaquete de visibilidad

+1

Leer un poco de información ayudaría, p. [Pensando en Java] (http://www.mindview.net/Books/TIJ/) capítulo 5. Todo esto ha sido escrito antes. –

+1

Para las interfaces, la visibilidad predeterminada es pública. ;) –

Respuesta

0

Lo que se obtiene por default modificador es decir, sin ningún modificador de acceso (es decir, pública o privada protegida), significa que es visible para todos dentro de un paquete en particular. Entonces, cuando desee que su clase sea accesible solo en su propio paquete, debe optar por el default.

Leer más: Controlling Access

3

Mi understaning es el acceso paquete/por defecto es para internos del paquete, es decir clases que no forman interfaz del paquete de, es decir, las clases que no deben utilizarse fuera del paquete.

7

Como dijo Rostislav Matl, es útil para cuando quiere hacer algo que no forma parte de la interfaz de su paquete.

Como ejemplo, imagine que tiene un paquete y proporciona una interfaz y al menos una implementación concreta de un servicio.

Las personas que utilizan este servicio se preocuparán por la interfaz que proporcione y utilizará una de las clases concretas que proporcione, pero no les interesará mucho más. Nuestro servicio tiene que hablar con una base de datos y debe poder asignar el resultado de las consultas de la base de datos a su propio tipo de datos (que forman su contrato).

Creo que regularmente creo paquetes de clases de ayuda privadas que contienen métodos de tipo de utilidad o realizan tareas como la asignación que necesitamos. La visibilidad predeterminada (paquete privado) es perfecta para esto porque otras clases dentro de su paquete pueden usar estos ayudantes, pero nadie fuera del paquete puede verlos, por lo que puede cambiarlos cuando lo desee.

Este es un ejemplo utilizando un código:

Tenemos nuestra interfaz:

public interface UsefulService { 
    Collection<DataThings> getThings(Identifier id); 
} 

... y nuestra aplicación concreta:

public class JdbcUsefulServiceImpl implements UsefulService { 

    //We can break the code for the mapping out into its own class 
    private Mapper mapper; 

    @Override 
    public Collection<DataThings> getThings(Identifier id){ 
     DatabaseQueryResult queryResult = //Code to hit a database and return objects from that domain model 
     Collection<DataThings> result = mapper.mapFromDatabaseToServiceDomain(queryResult); 
     return result; 
    } 
} 

entonces tenemos nuestro asignador. No necesitamos a nadie fuera del paquete que se preocupan por el servicio funciona internamente de modo que utilizamos el paquete visibilidad privada y podemos tener tantas clases como queremos hacer el trabajo:

class Mapper { 
    Collection<DataThings> mapFromDatabaseToServiceDomain(DatabaseQueryResult queryResult){ 
     //magic to map objects goes here 
    } 
} 

La ventaja que tenemos es que siempre podemos cambiar esta clase de Mapper como queramos o eliminarla o crear nuevas clases privadas de paquete y sabemos que los únicos efectos (inmediatos) que podemos causar están dentro de este paquete. Por efectos inmediatos me refiero a errores de compilación y cosas serias como esa. Obviamente, podría interrumpir su servicio si cambia su comportamiento, pero eso es lo que su suite de pruebas automatizada está ahí para detectar: ​​P