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();
bar
和reset
方法在这里返回。
但是,想要做到这一点往往表明,对象没有足够丰富的行为。 尝试重构到被调用的类。 也许有一个以上的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);