Frage

Ich arbeite in Java auf einem ziemlich großen Projekt.Meine Frage ist, wie man am besten die Struktur der Satz von Eigenschaften, die für meine Anwendung.

Ansatz 1:Einige statische Eigenschaften-Objekt zugreifen, indem Sie jeder Klasse.(Nachteile:dann, einige Klassen verlieren Ihre Allgemeingültigkeit, sollten Sie aus dem Kontext der Anwendung;Sie erfordern auch die expliziten Aufrufe statisches Objekt, das sich in eine andere Klasse und kann in der Zukunft verschwinden;es funktioniert einfach nicht fühlen richtig, bin ich falsch?)

Ansatz 2:Die Eigenschaften instanziiert werden, indem Sie die main-Klasse und übergeben nach unten zu den anderen Anwendungsklassen.(Nachteile:Sie am Ende wird ein Zeiger übergeben, um die Eigenschaften der Objekt zu fast jeder Klasse, und es scheint sehr redundant und schwerfällig;Ich nicht wie es.)

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Ich mag mit Spring dependency injection für viele der Eigenschaften.Sie können behandeln Ihre Anwendung wie Bausteine und injizieren Sie die Eigenschaften direkt in die Komponente, die Sie braucht.Dies bewahrt (ermutigt) die Kapselung.Dann, Sie montieren Ihre Bauteile zusammen und erstellen Sie die "main-Klasse".

Ein netter Nebeneffekt der dependency injection ist, dass Ihr code sollte einfach getestet werden.

Andere Tipps

Eigentlich Ansatz 2 funktioniert wirklich gut.

Ich habe versucht, eine Singleton Eigenschaft auf einem aktuellen Projekt-Objekt. Dann, wenn es Zeit ist gekommen Funktionen hinzuzufügen, muss ich die Singleton zu überarbeiten, und bedauerte, jeden Ort zu finden, wo ich MySingleton.getInstance() verwendet.

Ansatz 2 von einem globalen Informationsobjekt durch Ihre verschiedene Konstrukteuren vorbei ist leichter zu kontrollieren.

Mit einer expliziten Setter hilft auch.

class MyConfig extends Properties {...}

class SomeClass {
    MyConfig theConfig;
    public void setConfi( MyConfig c ) {
        theConfig= c;
    }
    ...
}

Es funktioniert gut, und du wirst glücklich sein, dass Sie fest präzise gesteuert, welche Klassen tatsächlich benötigen Konfigurationsinformationen.

Wenn die Eigenschaften von vielen Klassen benötigt werden, würde ich für Ansatz geht 1. Oder vielleicht eine Variante, bei der Sie das Singleton-Entwurfsmuster verwenden, anstatt alle statischen Methoden. Das bedeutet, dass Sie nicht über einige Eigenschaften Objekt herum zu halten haben vorbei. Auf der anderen Seite, wenn nur wenige Klassen diese Eigenschaften benötigen, können Sie Ansatz 2, aus den Gründen, wählen Sie erwähnt. Vielleicht haben Sie auch, sich fragen wollen, wie wahrscheinlich es ist, dass die Klassen, die Sie schreiben, werden tatsächlich wieder verwendet werden und wenn ja, wie viel von einem Problem ist es auch wieder verwenden die Eigenschaften widersprechen. Wenn die Wiederverwendung nicht wahrscheinlich ist, nicht die Mühe mit ihm jetzt und die Lösung wählen, die die einfachste für die aktuelle Situation ist.

Klingt wie Sie eine Konfigurationsmanager-Komponente benötigen. Es würde über eine Art von Service Locator finden, die so einfach wie ConfigurationManagerClass.instance() sein könnte. Das würde alles, was Spaß einzukapseln. Oder Sie könnten ein Dependency Injection-Framework wie Spring verwenden.

, hängt davon ab, wie Komponenten einander in Ihrer Architektur. Wenn Ihre andere Komponenten als Referenzen herumgereicht werden, tun. Seien Sie einfach konsequent.

Wenn Sie auf der Suche nach etwas schnell Sie die Systemeigenschaften verwenden können, sind sie für alle Klassen zur Verfügung. Sie können einen String-Wert speichern oder wenn Sie eine Liste von ‚Zeug‘ speichern, müssen Sie die System.Properties () -Methode verwenden. Dies gibt ein ‚Eigenschaften‘ Objekt, das eine HashTable ist. Sie können dann speichern, was auch immer Sie in die Tabelle möchten. Es ist nicht schön, aber es ist eine schnelle Möglichkeit, globale Eigenschaften zu haben. YMMV

ich in der Regel für ein Singleton-Objekt gehen, die in einem gemeinsamen Projekt befindet, und enthält eine Hash-Tabelle von selbst auf Namensraum verkeilt, für die jeweils in einer Klasse Eigenschaften resultieren.

Dependency Injection ist auch eine schöne Art und Weise tun.

Ich fühle mich wohler, wenn ich einen statischen Zeiger auf meine In-Memory-Eigenschaften haben. einige Male wollen Sie Eigenschaften in Laufzeit oder andere Funktionalität neu zu laden, die mit einem statischen Verweis einfacher zu implementieren ist.

nur daran erinnern, dass keine Klasse ist eine Insel. eine wiederverwendbare Klasse kann eine Client-Klasse hat den Kern frei von dem Singletone Bezug zu halten.

Sie können auch Schnittstellen verwenden, versuchen Sie es einfach nicht zu übertreiben.

Approache 2 ist defenetly besser.

Wie auch immer, man sollte nicht andere Klasse Durchsuchung Config Objekt lassen. Sie sollten config in der Config-Objekt ouside das Objekt genommen INJET.

Hier finden Sie aktuelle Apache Commons Konfiguration um Hilfe bei der Konfiguration Impl.

So in der main () Sie könnte

MyObject mobj = new MyObject();
mobj.setLookupDelay(appConfig.getMyObjectLookupDelay);
mobj.setTrackerName(appConfig.getMyObjectTrackerName);

Anstelle von

MyObject mobj = new MyObject();
mobj.setConfig(appConfig);

wo appconfig ist ein Wrapper um die Apache-Konfigurationsbibliothek, die in einer Konfigurationsdatei auf dem Namen des Wertes all den Nachschlag der Wertebasis zu tun.

Auf diese Weise Ihr Objekt sehr leicht überprüfbar werden.

Haben Sie nicht Java für eine Weile getan, aber können Sie nicht nur die java.lang.System Eigenschaften setzen Sie Ihre Eigenschaften in? Auf diese Weise kann die Werte zugreifen überall und vermeiden eine „globale“ Festigkeitsklasse mit.

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