WITH语句在Java中

在VB.NET中有WITH命令,可以让你省略一个对象名称,只访问所需的方法和属性。 例如:

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

Java中是否有这样的语法?

谢谢!

不可以。当expression式过长时,您可以做的最好的方法是将其分配给一个带有短名称的局部variables,然后使用{...}创build一个范围:

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

也许在Java中最接近的做法是在构build过程中使用双重大括号。

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

或者,返回的方法可以链接在一起:

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

barreset方法在这里返回。

但是,想要做到这一点往往表明,对象没有足够丰富的行为。 尝试重构到被调用的类。 也许有一个以上的class级试图脱身。

使用Java 8 lambdaexpression式可以非常接近,缺点是不能修改局部variables。

声明这个方法:

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

所以你可以使用:

 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 }); 

这也可以使用匿名类,但不是那么干净。

一些对象允许你“链接”方法调用,这接近你喜欢的语法。 例如,构build器类通常会从方法返回,所以你可以这样做:

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

每一个set...方法都会返回this所以你可以链接下一个调用。

最接近这一点的是静态导入,它将允许您调用静态方法,而不显式指定方法所在的类。

不。 Java有一个避免任何可能减less冗长的策略。

那么写完这个之后,我发现最接近的东西可能是静态import,例如

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

现在你可以做

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

正如已经说过的,你不能在Java中这样编写代码。

就像一个注释一样,如果您在需要更改variables名称的情况下担心需要复制/粘贴,Eclipse允许您自动重命名variables的所有引用:

在“foo”variables名上使用ALT + SHIFT + R ,可以一次全部重命名为“myFoo”,例如:

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