WITH-statement in Java

In VB.NET gibt es den WITH-Befehl, mit dem Sie einen Objektnamen weglassen und nur auf die Methoden und Eigenschaften zugreifen können. Beispielsweise:

With foo .bar() .reset(true) myVar = .getName() End With 

Gibt es eine solche Syntax in Java?

Vielen Dank!

Nein. Das Beste, was Sie tun können, wenn der Ausdruck zu lang ist, besteht darin, ihn einer lokalen Variablen mit einem kurzen Namen zuzuweisen und {...} zu verwenden, um einen Bereich zu erstellen:

 { TypeOfFoo it = foo; // foo could be any lengthy expression it.bar(); it.reset(true); myvar = it.getName(); } 

Vielleicht ist der beste Weg, dies in Java zu tun, das Doppelklammer-Idiom, während der Konstruktion.

 Foo foo = new Foo() {{ bar(); reset(true); myVar = getName(); // Note though outer local variables must be final. }}; 

Alternativ können Methoden, die this , verkettet werden:

 myName = foo .bar() .reset(true) .getName(); 

bar und reset Methoden geben this .

Wenn Sie dies jedoch tun möchten, deutet dies darauf hin, dass das Objekt nicht reich genug ist. Versuchen Sie, in die aufgerufene class umzuwandeln. Vielleicht gibt es mehr als eine class, die versucht herauszukommen.

Mit Java-8-Lambdas können Sie ziemlich nah kommen, mit dem Nachteil, dass Sie lokale Variablen nicht ändern können.

Deklarieren Sie diese Methode:

 static  void with(T obj, Consumer c) { c.accept(obj); } 

So können Sie verwenden:

 Window fooBarWindow = new Window(null); String mcHammer = "Can't Touch This"; with(fooBarWindow, w -> { w.setAlwaysOnTop(true); w.setBackground(Color.yellow); w.setLocation(300, 300); w.setTitle(mcHammer); // can read local variables //mcHammer = "Stop!"; // won't compile - can't modify local variables }); 

Dies ist auch mit einer anonymen class möglich, aber nicht so sauber.

Einige Objekte ermöglichen es Ihnen, Methodenaufrufe zu “ketten”, die sich der von Ihnen gewünschten Syntax annähern. Zum Beispiel wird sich eine Builder-class häufig selbst von Methoden zurückgeben, sodass Sie so etwas tun können:

 MyObject b = new MyBuilder().setFoo(5).setBar(6).setBaz("garply!").build(); 

Jede set... -Methode gibt this so dass Sie den nächsten Aufruf verketten können.

Nee. Java hat eine Strategie, alles zu vermeiden, was die Ausführlichkeit verringern könnte.

Nun, nachdem ich dies geschrieben habe, ist mir gerade eingefallen, dass die nächste Sache statische Importe sein könnten, z

 package abcd; public class Foo { public static void bar() { ... } } 

und jetzt kannst du es tun

 package def; import static abcdFoo.*; bar(); 

Am nächsten kommen statische Importe, mit denen Sie statische Methoden aufrufen können, ohne explizit die class anzugeben, für die die Methode existiert.

Wie bereits gesagt, können Sie den Code nicht wirklich in Java schreiben.

Nur als Kommentar, wenn Sie Angst vor vielen Kopieren / Einfügen in dem Fall haben, müssen Sie den Variablennamen ändern, Eclipse können Sie alle Referenzen der Variablen automatisch umbenennen:

Wenn Sie ALT + UMSCHALT + R für den Variablennamen “foo” verwenden, können Sie alle gleichzeitig auf “myFoo” umbenennen:

 Foo myFoo = new Foo(); myFoo.bar(); myFoo.reset(true);