Pregunta

Estoy usando una interfaz llamada Predicate que se utiliza para examinar Colecciones. Por ejemplo, puedo definir

public class BlackCatPredicate implements Predicate<Cat> {
  public boolean evaluate( Cat c ) {
       return c.isBlack();
  }
}

y luego use algún método de utilidad findAll( Collection<T> coll, Predicate<T> pred) para aplicar el predicado a una colección de gatos y obtener solo los negros, etc.

Mi pregunta es la siguiente: estoy encontrando gatos negros en todo mi código, por lo que no es necesario seguir creando instancias de BlackCatPredicate una y otra vez. Debería tener solo una instancia. (¿Un singleton?) Pero luego, a lo largo de la escritura de muchos predicados, no quiero tener que implementar cada uno como un singleton. Entonces, ¿cuál es el diseño adecuado aquí?

¿Fue útil?

Solución

Usaría una constante de clase anónima y la pondría con la clase en la que opera:

public class Cat{
    public static final Predicate<Cat> BLACK_PREDICATE = new Predicate<Cat>(){
            public boolean evaluate( Cat c ) {
                return c.isBlack();
            }
        };

    // Rest of the Cat class goes here
}

Si el predicado tiene parámetros, puede usar un método estático de fábrica.

Editar: Como se señaló en los comentarios, dependiendo de los patrones de uso, puede dar como resultado un código más claro para recopilar las constantes predicadas (y / o métodos de fábrica) en una clase separada, ya sea solo aquellos para Cat, o todos ellos. Depende principalmente de su número, de la cantidad de organización adicional que sea útil.

Otros consejos

Algo como esto debería funcionar:

class Predicates
{
    private static class BlackCatPredicate implements Predicate<Cat> 
    {
        public boolean evaluate(final Cat c) 
        {
            return c.isBlack();
        }
    }

    private static final BlackCatPredicate = new BlackCatPredicate(); 


    public static Predicate<Cat> getBlackCatPredicate()
    {
        return (blackCatPredicate);
    }
}

Podría crear una fábrica genérica que tome cualquier predicado como un tipo arg - y luego genere una única instancia para un tipo de predicado dado.

Otro enfoque más general sería comenzar a usar una biblioteca de inyección de dependencias y crear toda su creación de objetos a través de ella. Por lo general, puede cambiar un tipo para que sea un singleton, si corresponde, con pocos cambios.

No me preocuparía en absoluto crear BlackCatPredicate instancias adicionales.

Si no te gusta escribir new BlackCatPredicate() por todas partes, puedes agregar un método de fábrica estático para que puedas escribir BlackCatPredicate.getInstance() en su lugar. Otra opción sería crear una clase separada para que pueda escribir CatPredicates.getBlackCatPredicateInstance().

Sin embargo, esto es solo para abstraer la creación del predicado del código del cliente, no tiene nada que ver con la creación real de objetos. Tratar con objetos de corta duración es una de las cosas que la JVM hace mejor, por lo que crear un montón de <=> instancias adicionales y descartarlas de inmediato no afectará su rendimiento en lo más mínimo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top