2012-08-10 16 views
11

Encontré esta construcción en algún código.Idioma de programación Java: clase de implementación privada

¿Hay algún beneficio de tener una clase privada estática implementar A? Esto me recordó el modismo Pimpl en C++. ¿Hay alguna ventaja de usar el modismo Pimpl en Java?

public abstract class A { 
    public void doStuff(); 

    public static A getNewInstance() { 
     return new AImpl(); 
    } 

    private static class AImpl extends A { 
     public void doStuff() { 
      .... 
     }  
    } 

} 

Respuesta

17

¿Hay algún beneficio de tener una clase estática privada implementar una?

Bueno, oculta la implementación por completo, por lo que desde un punto de vista de encapsulación es bastante agradable. Una situación que he visto en algunas ocasiones es la de los comparadores personalizados. Por ejemplo:

public class Person 
{ 
    public static final Comparator<Person> NAME_COMPARATOR = new NameComparator(); 
    public static final Comparator<Person> AGE_COMPARATOR = new AgeComparator(); 

    // Name, age etc properties 

    private static class NameComparator implements Comparator<Person> 
    { 
     ... 
    } 

    private static class AgeComparator implements Comparator<Person> 
    { 
     ... 
    } 
} 

No hay necesidad real para las clases de implementación comparador ser visible fuera Person, y es agradable ser capaz de obtener una instancia fácilmente a través del campo estático público.

Ninguna persona que llama necesita saber la implementación - simplemente podría haber una clase de comparación que toma parámetros, por ejemplo, simplemente expresan qué comparador quieren a través de las constantes. (También podría usar una enumeración para esto, por supuesto.)

+1

Gracias por la respuesta. ¿Pero no es mejor tener 'NameComparator' y' AgeComparator' como clases no públicas? No estoy seguro, pero si no agrego una clase interna estática, ¿será incompatible con los binarios? – Chip

+0

@Chip: si son clases no públicas fuera de 'Persona ', todavía están disponibles en el mismo paquete cuando realmente no es necesario. Agregar una clase interna estática * puede * cambiar el UID de serialización a menos que usted lo especifique explícitamente, pero la serialización binaria en Java es tan horrible que no la utilizo de todos modos. No creo que afecte la compatibilidad binaria de simplemente ejecutar el código. –

+0

Gracias Jon. Tiene sentido si no rompe la compatibilidad binaria. Para que el diseño sea flexible, me gustaría poder agregar otra clase, decir 'AImpl2' de la misma manera, y no romper clientes más antiguos. – Chip

Cuestiones relacionadas