2016-08-29 8 views
2

Ich glaube, ich habe mich ein wenig verwirrt - jedenfalls, wie rufe ich eine Methode auf eine andere Methode. Wie method(). Method(). Method(); ? Ich möchte eine ähnliche Methode selbst für diesen Beispielcode erstellen:JAVA-Methode Aufruf Methode

public RECT getPositionOfClient() { 
    HWND client = User32.INSTANCE.FindWindow("classname", "client"); 
    RECT rect = new RECT(); 
    User32.INSTANCE.GetWindowRect(client , rect); 
    System.out.println("rect = " + rect); 
    return rect; 
} 

Hier würde Ich mag Lage Anruf getPositionOfClient().getTop(); or getPositionOfClient().getBottom(); sein, die etwas ist, die JNA RECT-Klasse bietet (oben, unten, links, Recht). Wie mache ich das?

Vielen Dank im Voraus :)

+0

method1(). Method2() ist gültig, wenn method1 ein Objekt zurückgibt, das method2 aufrufen kann –

Antwort

3

Um das möglich zu machen, müssen Sie fließend APIs.

Bedeutung: jede Ihrer Methoden ... muss einige Objekt zurückgeben; wie:

Whatever a() { ... does something ... and 
return whatEverInstance; 
} 

und dann, wenn alle Ihre a() s, und b() Rückkehr etwas können Sie einen solchen Code aufzuschreiben.

Und wenn Sie „Aufenthalt“ in derselben Klasse, und jede Methode ist nur ein

return this; 
tun

so halten Sie Methoden auf demselben Objekt aufgerufen; als das ist eine irgendwie akzeptable Praxis.

Für alle anderen Fälle: sollten Sie wirklich vorsichtig sein, das zu tun! Da diese Praxis in diesem Fall bedeutet: Verletzung Law of Demeter.

Der Punkt ist: eine Klasse sollte nur über seine direkten Nachbarn kennen. Sie möchten keinen Code wie

myField.doSomething().inSomeOtherClass().andNow2HopsAway() ... 

schreiben, denn das koppelt diesen Code an eine völlig andere Klasse.

Lange Geschichte kurz: bauen Sie nicht fließend APIs nur für den Spaß daran. Überlegen Sie sorgfältig, wo sie sinnvoll sind. und vergiss niemals das Gesetz von Demeter!

BEARBEITEN; nachdem Sie Ihre Fragen und Kommentare eingehender gelesen haben; Ich denke, dass Sie nicht nur verwirrt sich selbst, sondern auch uns:

ab sofort

public RECT getPositionOfClient() { ... returns an instance of RECT } 

Und oben, links, ... sind Felder auf RECT.

So erhalten Sie

int whatever = foo.getPositionOfClient().top; 

Erledigt. Es ist ein Feld; Sie brauchen nichts anderes als ".top" zu verwenden, wenn Ihre Methode bereits ein RECT!

+0

Wenn Mr. anonymous-downvote immer noch vorhanden ist; erkläre bitte, was deine Aktion motiviert hat. – GhostCat

+0

Ich sehe Ihren Punkt, aber wäre es nicht sinnvoll, dies fließend für getRect() zu tun. GetTop(); Anstatt 4 verschiedene Methoden, die unabhängig voneinander oben, unten, rechts und links zurückgeben? - Ich habe dir eine Danksagung gemacht, um den Downvote auszugleichen. Ich schätze deine Antwort! –

+0

Wie gesagt; Es hängt von deinem Kontext ab. Die große Frage ist: Was ist ein "guter" Rückgabewert für eine Methode namens getTop() - ein weiterer RECT? Wäre das der gleiche wie getRect(), den du bekommen hast - oder den einen "on top" von RECT von getRect() ?! – GhostCat

0

Sie rufen eine Methode nicht auf eine andere Methode, Sie rufen eine Methode auf Rückgabewert einer anderen Methode.method().method().method(); ist nur der gesetzliche Code, wenn method() einen Typ zurückgibt, der selbst einen Methodennamen method() hat. Für Ihren Code brauchen Sie nur welchen Typ getPositionOfTop() zurück zu sich haben getTop() und getBottom().

0

Methoden werden von einem Objekt aufgerufen. Die Sache, für die Sie eine Methode/Eigenschaft aufrufen, muss ein Objekt sein. Wenn Sie Methoden verketten möchten, sollte jede Methode einen Wert zurückgeben, der eigentlich ein Objekt ist. (Außer der letzten Methode). Klassen, die für die Verkettung von Methoden geeignet sind, geben sich selbst als Rückgabewert einer Methode zurück.

0

Es ist nicht so, wie Sie Methode() auf eine andere Methode aufrufen. Für Beispiel:

Sie haben eine JSON-Zeichenfolge, die einer Pojo-Klasse namens Demo zugeordnet ist. So, jetzt sind Sie in einer Gson Class-Bibliothek von Gson API, die verwendet wird, um JSON-String in Class Object zu konvertieren.

new Gson().fromJson(inputString,Demo.class).toString(). 

So Hier Gson(), die ein Konstruktor-Methode Rückgabeobjekt von Gson Klasse.

new Gson() 

Jetzt können wir indem die fromJson (String, ClassofT) -Methode die von Gson Constructor zurückgegebene Objekt verwenden nennen. Diese Methode konvertiert die angegebene JSON-Zeichenfolge in ein Demo-Klassenobjekt.

new Gson().fromJson(inputString,Demo.class) 

Dann rufen wir die toString-Methode der Demo-Klasse auf, um unsere Informationen zu drucken. Wie Sie sehen können, können Sie eine Methode für ein Rückgabetypobjekt aufrufen und sind gültig, wenn diese Methode für dieses Objekt existiert.