2014-01-17 23 views
32

Ich möchte Methodenverkettung in Java erreichen.Wie erreicht man Methodenverkettung in Java?

Wie kann ich es erreichen?

Auch lassen Sie mich wissen, wann es zu verwenden.

public class Dialog { 

    public Dialog() { 

    } 

    public void setTitle(String title) { 

     //Logic to set title in dialog 
    } 

    public void setMessage(String message) { 

     //Logic to set message 
    }  

    public void setPositiveButton() { 

     //Logic to send button 
    } 
} 

Ich möchte Methode Verkettungs erstellen, die ich verwenden kann, wie folgt:

new Dialog().setTitle("Title1").setMessage("sample message").setPositiveButton(); 

oder wie

new Dialog().setTitle("Title1").setMessage("sample message"); 

oder wie

new Dialog().setTitle("Title1").setPositiveButton(); 
+3

Wie die Builder-Muster? –

+2

Dies wird in der Regel als fließend oder fließend bezeichnet. – Pureferret

+0

Sie würden einen Builder für den Dialog erstellen, anstatt die Setter für eine flüssige API zu verwenden. Wenn Sie dies tun, werden viele Bean-ähnliche Zugriffe nicht mehr funktionieren, da die Frameworks die Setter so einschränken, dass sie void zurückgeben. Schauen Sie sich Projekt lombok an, wenn Sie nicht alle diese Kesselplatte schreiben möchten. –

Antwort

65

Haben Sie Ihre Methoden this zurückkehren mögen :

public Dialog setMessage(String message) 
{ 
    //logic to set message 
    return this; 
} 

nach jedem Aufruf einer der Methoden Auf diese Weise werden Sie das gleiche Objekt erhalten zurückgeführt, so dass Sie eine andere Methode auf aufrufen können.

Diese Technik ist nützlich, wenn Sie eine Reihe von Methoden für ein Objekt aufrufen möchten: Es reduziert die Menge an Code, die erforderlich ist, um dies zu erreichen, und ermöglicht Ihnen, nach der Methodenkette einen einzelnen zurückgegebenen Wert zu erhalten.

Ein Beispiel für die Menge von Codes zu reduzieren wäre, um einen Dialog zeigen erforderlich:

// Your Dialog has a method show() 
// You could show a dialog like this: 
new Dialog().setMessage("some message").setTitle("some title")).show(); 

Ein Beispiel für den einzelnen zurückgegebene Wert unter Verwendung sei:

// In another class, you have a method showDialog(Dialog) 
// Thus you can do: 
showDialog(new Dialog().setMessage("some message").setTitle("some title")); 

Ein Beispiel für die Verwendung von Builder-Muster, das Dennis in dem Kommentar zu Ihrer Frage erwähnt:

new DialogBuilder().setMessage("some message").setTitle("some title").build().show(); 

Der Erbauer pat Mit dieser Option können Sie alle Parameter für eine neue Instanz einer Klasse festlegen, bevor das Objekt erstellt wird (berücksichtigen Sie Klassen, die final Felder oder Objekte enthalten, für die das Festlegen eines Werts nach dem Erstellen teurer ist als beim Erstellen).

Im Beispiel oben: setMessage(String), gehören setTitle(String) zur DialogBuilder Klasse und gibt die gleiche Instanz von DialogBuilder, dass sie aufgefordert sind; Die build()-Methode gehört zur Klasse DialogBuilder, gibt aber ein Objekt Dialog zurück, das show() gehört zur Klasse Dialog.

Extra-

Dies könnte nicht auf Ihre Frage in Beziehung gesetzt werden, aber es könnte Ihnen und anderen helfen, die sich über diese Frage kommen.

Das funktioniert gut für die meisten Anwendungsfälle: alle Anwendungsfälle, die Vererbung nicht beinhalten und einige besondere Fälle Vererbung beteiligt, wenn die abgeleitete Klasse neue Methoden nicht hinzufügen, die Sie Kette wollen zusammen und du bist nicht daran interessiert, das Ergebnis der Methodenkette als Objekt des Abgeleiteten zu verwenden (ohne Casting).

Wenn Sie Methoden für Objekte abgeleiteter Klassen verketten möchten, die keine Methode in ihrer Basisklasse haben oder wenn die Methodenkette das Objekt als Referenz der abgeleiteten Klasse zurückgeben soll, können Sie a schau dir die Antworten für this question an.

+0

Ich habe das Beispiel zuletzt hinzugefügt, da ich einen Teil Ihrer Frage verpasst habe. Beachten Sie, dass dies nicht die einzigen Verwendungen für Methodenverkettung und/oder Builder-Muster sind: Wie bei den meisten Codierungsmustern, Algorithmen und Techniken, kann mit ein wenig Kreativität ein neuer Gebrauch für ein altes Muster (Algorithmus, Technik) gefunden werden :) –

+0

Es ist keine gute Übung, das Einstellungsverhalten zu ändern, da einige Frameworks keine Rückgabe von der Setter-Methode erwarten. Wie zum Beispiel erhalten Sie einen Fehler mit Cassandra Java-Treiber, wenn die Setter in Ihrem Modell einige Werte zurückgeben werden. – Vagif

0

Beispiel die Menge an Code reduziert erforderlich, um einen Dialog zu zeigen, wäre:

package com.rsa.arraytesting; 

public class ExampleJavaArray { 

String age; 
String name; 

public ExampleJavaArray getAge() { 
    this.age = "25"; 
    return this; 
} 

public ExampleJavaArray setName(String name) { 
    this.name = name; 
    return this; 
} 
public void displayValue() { 
    System.out.println("Name:" + name + "\n\n" + "Age:" + age); 
} 
} 

andere Klasse

package com.rsa.arraytesting; 

public class MethodChaining { 

public static void main(String[] args) { 

    ExampleJavaArray mExampleJavaArray = new ExampleJavaArray(); 

    mExampleJavaArray.setName("chandru").getAge().displayValue(); 

} 

} 
+0

Paket com.rsa.arraytesting; public class MethodChaining { \t public static void main (String [] args) { \t \t ExampleJavaArray mExampleJavaArray = new ExampleJavaArray(); \t \t mExampleJavaArray.setName ("chandru"). GetAge(). DisplayValue(); \t} } –

1

einfach eine statische Builder Methode hinzufügen, und einen anderen Satz der Setter Methoden erstellen . Zum Beispiel

class Model { 
    private Object FieldA; 

    private Object FieldB; 

    public static Model create() { 
     return new Model(); 
    } 

    public Model withFieldA(Object value) { 
     setFieldA(value); 
     return this; 
    } 

    public Model withFieldB(Object value) { 
     setFieldB(value); 
     return this; 
    } 
} 

...

Und es verwenden, wie

Model m = Model.create().withFieldA("AAAA").withFieldB(1234); 
Verwandte Themen