Ich habe eine Klasse, die Zeilen im Tabellenlayout erstellt. Die Erstellung von Zeilen hängt von Daten und Metadaten ab. Da die Metadaten für jede Zeile gleich sind, z. B. Sichtbarkeitseigenschaften ein- / ausblenden, habe ich die Metadaten-Eigenschaft als statische Eigenschaft erstellt und initialisiere sie einmal mit initWidget
von RowWidget
.
nur Beispiel:
%Vor%Dann habe ich unter Konstruktor für jeden Datensatz Daten aufgerufen.
%Vor% Da ich dachte, das ist nicht richtig Ansatz. weil als Muster, wenn jemand diese Klasse dann sieht, wird es eine Zeile erstellen. Ich möchte nicht zuerst initWidget
aufrufen. Ich möchte jeden erforderlichen Parameter im Konstruktor nur wie
Aber aufgrund dessen hat Konstruktor keine Argumente. und ich denke, es ist auch ein schlechtes Muster, 5+ Parameter im Konstruktor zu haben.
Sagt mir jemand:
Hinweis : Ich weiß, dass dies nur durch statische Methoden möglich ist, aber nicht statisch sein soll.
Hinweis : Ich möchte keine andere Klasse erstellen, um dies zu erreichen. oder irgendeine Getter / Setter-Methode.
Danke im Voraus.
Ich würde Builder-Muster vorschlagen. Sie benötigen eine zusätzliche Klasse, um RowWidget-Objekte zu erstellen. Also würde der Anruf so aussehen:
%Vor%Hier ist eine schöne Erklärung des Musters: Ссылка
Warum nicht eine Methode erstellen, die die newValues für die Eigenschaften akzeptiert, die Sie ändern möchten & amp; Gibt eine neue Instanz der Klassen mit allen anderen Eigenschaften zurück, die von der Instanz kopiert wurden, auf der Sie diese Methode aufgerufen haben.
Sie könnten die Parameter aus der RowWidget
-Klasse beispielsweise in einer RowWidgetConfig
-Klasse trennen / extrahieren.
Erstellen Sie nun einmal eine Instanz dieser Klasse und übergeben Sie sie unter den anderen Parametern an RowWidget
constructor.
Eine andere Alternative wäre factory
zum Erstellen von RowWidget
Instanzen. Die Factory enthält außerdem alle Parameter, die Sie für eine Zeileninstanz benötigen, sowie eine Factory-Methode createNewRowWidget
, die eine Instanzbasis für die in der Factory enthaltenen Parameter erstellt.
Wie man eine Klasse konstruiert, die dieselbe Eigenschaft in einer anderen Instanz benötigt?
Um dies zu erreichen, können Sie eine Superklasse mit allen gewünschten Eigenschaften haben. Jede Klasse, die diese Superklasse erweitert, wird also diese Eigenschaften haben. Auf diese Weise müssen Sie static
keyword nicht verwenden.
Was ist der beste Weg, eine Klasse mit einer Standard-Fix-Eigenschaft für alle Instanzen zu konstruieren?
Für diesen können Sie eine Schnittstelle mit einigen konstanten Eigenschaften haben. Auf diese Weise erhält jede Klasse, die diese Schnittstelle implementiert, die festen Eigenschaften.
Das statische initWidget () Ding scheint mir einfach nicht richtig zu sein. Obwohl Sie wahrscheinlich jetzt nur eine Menge RowWidget
s haben, die einige Eigenschaften teilen, ist es auch sinnvoll, 2 Mengen RowWidget
s zu haben, jede Menge hat ihre eigenen "shared" Eigenschaften. Die Dinge werden viel flüssiger und Sie haben viel mehr Möglichkeiten beim Aufbau vernünftiger APIs, wenn Sie Ihren Code umgestalten, um ein vernünftigeres Design zu erstellen.
Nehmen wir jetzt an, dass ich etwas wie eine RowGroup vorstelle (was die von Ihnen erwähnte "geteilte" Sache darstellt)
(Ehrlich gesagt, ich verstehe nicht ganz die Bedeutung für Ihr Design, ich mache es nur auf Basis Ihres Codes);
%Vor%Wenn Leute es verwenden, sieht es ungefähr so aus:
%Vor%Sie können sogar Builder-ähnliche Syntax oder viele andere Optionen angeben.
%Vor%Noch wichtiger, das Design macht jetzt mehr Sinn für mich.
Wenn Sie keine andere Klasse erstellen wollten, würde ich vorschlagen, was A4L vorgeschlagen hat. Ohne eine andere Klasse zu erstellen, würde ich einen Konstruktor erstellen, der alle Parameter und die Factory-Methode verwendet, die die aktuelle Instanz als Vorlage verwendet, und ihre eigenen Parameter an den Konstruktorparameter übergibt.
Beispiel (mit offensichtlichen Teilen weggelassen)
%Vor%Tags und Links java design-patterns