2012-02-02 12 views
6

tengo una clase a lo largo de las líneas demanera apropiada a la subclase de guayaba ImmutableSet

class Receipt 
{ 
    private Set<Order> orders; 
    public Receipt(Set<Order> orders) 
    { 
     this.orders = ImmutableSet.copyOf(orders) 
    } 
} 

Esto me ha servido bien.

Sin embargo, debido a algunos problemas de tipo de borrado & de persistencia que estoy enfrentando, me gustaría presentar ahora una forma de

class OrderSet extends Set<Order> {} 

Obviamente no puedo extender Set<Order>, ya que es una interfaz. Me gustaría mantener mi implementación como inmutable. Sin embargo, no puedo extender ImmutableSet<Order>, como el estado docs:

Nota: A pesar de esta clase no es definitiva, no puede tener subclases fuera de su paquete ya que no tiene constructores públicos o protegidos. Por lo tanto, se garantiza que las instancias de este tipo son inmutables.

que podría utilizar la composición, dando OrderSet una colección respaldo de ImmutableSet y delegar todos los Set métodos a la misma. Sin embargo, esto parece excesivo.

¿Hay alguna otra forma en que pueda lograr una subclase no genérica aquí?

Respuesta

13

No, la composición no es exagerada, es exactamente el camino a seguir.

Usted debe crear su OrderSet de la siguiente manera porque, como Louis enfatiza en los comentarios, este caso de uso es exactamente lo que están destinados para:

public class OrderSet extends ForwardingSet<Order> { 
    private final ImmutableSet<Order> orders; 
    public class OrderSet (Set<Order> orders) { 
    this.orders = ImmutableSet.copyOf(orders); 
    } 
    protected ImmutableSet<Order> delegate() { return orders; } 
} 

Las clases inmutables en guayaba están diseñados para que no los extiendes Usted tiene que usar la composición y es precisamente la forma correcta de hacerlo.

+0

Además, recuerde hacer que su IDE escriba los métodos de delegación para usted. En eclipse, Source-Generate Delegated Method –

+4

Esto es _exactly_ para lo que 'ForwardingSet' y sus amigos son para. –

+0

Además, @PabloGrisafi, tu comentario es incorrecto. Debería sobrescribir 'ForwardingSet.delegate()' y no anular ningún método cuyo comportamiento no se modifique. –

Cuestiones relacionadas