Frage

Ich verwende eine Schnittstelle namens Prädikats, die für Sichten durch Sammlungen verwendet wird. Zum Beispiel kann ich definieren

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

und dann einige Dienstprogramm findAll( Collection<T> coll, Predicate<T> pred) Methode das Prädikat auf eine Sammlung von Katzen, und erhalten nur die schwarzen anzuwenden, etc.

Meine Frage ist diese: Ich finde alles über meinen Code schwarze Katzen, so gibt es keine Notwendigkeit zu halten, die BlackCatPredicate über Instanziierung und immer wieder. Es sollte nur eine Instanz hat. (A Singleton?) Aber dann, im Laufe viele Prädikate zu schreiben, ich möchte nicht jeden als Singleton zu haben, umzusetzen. Also - was ist das richtige Design hier

War es hilfreich?

Lösung

würde ich eine anonyme Klasse Konstante verwenden und es mit der Klasse setzen sie arbeitet auf:

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
}

Wenn das Prädikat Parameter hat, können Sie eine statische Factory-Methode verwenden.

Edit: Wie in den Kommentaren darauf hingewiesen, je nach Verwendungsmuster kann es in klarem Code führt die Prädikate (und / oder Factory-Methoden) in einer separaten Klasse zu sammeln, entweder solche, die nur für Katze, oder alle von ihnen. Es hängt vor allem von ihrer Zahl, wie viel zusätzliche Organisation ist hilfreich.

Andere Tipps

So etwas sollte funktionieren:

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);
    }
}

Sie können eine generische Fabrik machen, das jedes Prädikat als eine Art arg nimmt -. Und erzeugt dann eine einzelne Instanz für einen bestimmtes Prädikat Typen

Ein weiterer allgemeiner Ansatz wäre eine Dependency Injection-Bibliothek zu beginnen - und tun alle Ihre Objekterstellung durch. Normalerweise können Sie ein Typ-Schalter ein Singleton, gegebenenfalls mit wenig Veränderung sein.

Ich würde über das Erstellen von zusätzlichen BlackCatPredicate Instanzen keine Sorgen überhaupt.

Wenn Sie nicht wie new BlackCatPredicate() ganzen Ort Schreiben Sie sicherlich eine statische Factory-Methode hinzufügen können, so dass Sie BlackCatPredicate.getInstance() stattdessen schreiben. Dennoch wäre eine weitere Option sein, um eine eigene Klasse zu erstellen, so dass Sie CatPredicates.getBlackCatPredicateInstance() schreiben kann.

Doch dies nur für abstrahiert der Schaffung des Prädikats von dem Client-Code ist, es hat nichts mit dem tatsächlichen Objekterstellung zu tun. Der Umgang mit kurzlebigen Objekten ist eines der Dinge, die JVM am besten können, so ein paar zusätzlichen BlackCatPredicate Instanzen erstellen und sie sofort verworfen wird Ihre Leistung im Geringsten beeinflussen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top