Pergunta

Eu estou usando uma interface chamada predicado que é usado para peneirar Collections. Por exemplo, eu posso definir

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

e, em seguida, usar algum método utilitário findAll( Collection<T> coll, Predicate<T> pred) para aplicar o predicado para uma coleção de gatos, e obter apenas os negros, etc.

A minha pergunta é esta: eu estou achando gatos pretos por todo o meu código, por isso não há necessidade de manter instanciar o BlackCatPredicate uma e outra vez. Deve ter apenas uma instância. (A singleton?) Mas então, ao longo de escrever muitos predicados, eu não quero ter que implementar cada um como um singleton. Então - o que é o bom design aqui

Foi útil?

Solução

Eu usaria uma constante de classe anônima e colocá-lo com a classe atua em:

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
}

Se o predicado tem parâmetros, você pode usar um método de fábrica estático.

Editar: Como foi assinalado nos comentários, dependendo dos padrões de uso, pode resultar em código mais claro para recolher as constantes predicado (e / ou métodos de fábrica) em uma classe separada, seja apenas aqueles para Cat, ou todos eles. Depende principalmente seu número, o quanto a organização adicional é útil.

Outras dicas

Algo como isto deve 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);
    }
}

Você poderia fazer uma fábrica genérica que leva qualquer predicado como um tipo arg -. E, em seguida, gera uma única instância para um determinado tipo predicado

Outra abordagem mais geral seria para começar a usar uma biblioteca de injeção de dependência - e fazer tudo de sua criação do objeto através dele. Normalmente, você pode mudar de um tipo para ser um singleton, se apropriado, com pouca mudança.

Eu não me preocuparia com a criação de instâncias BlackCatPredicate extras em tudo.

Se você não gosta de escrever new BlackCatPredicate() todo o lugar que você certamente pode adicionar um método de fábrica estático para que você possa escrever BlackCatPredicate.getInstance() vez. Outra opção seria criar uma classe separada de modo que você pode escrever CatPredicates.getBlackCatPredicateInstance().

No entanto, esta é apenas para abstrair a criação do predicado do código de cliente, não tem nada a ver com a criação do objeto real. Lidar com objetos de vida curta é uma das coisas que a JVM faz melhor, criando assim um monte de instâncias BlackCatPredicate extras e descartá-los imediatamente não vai afetar o seu desempenho na mínima.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top