WITH statement in Java
在VB.NET中,有一个WITH命令可以省略对象名称,只访问所需的方法和属性。 例如:
1 2 3 4 5 | With foo .bar() .reset(true) myVar = .getName() End With |
Java中是否有这样的语法?
谢谢!
不可以。当表达式过长时,您可以做的最好的事情是将其分配给具有短名称的局部变量,并使用
1 2 3 4 5 6 | { TypeOfFoo it = foo; // foo could be any lengthy expression it.bar(); it.reset(true); myvar = it.getName(); } |
也许在Java中最接近的方法是在构造期间使用双支撑习语。
1 2 3 4 5 | Foo foo = new Foo() {{ bar(); reset(true); myVar = getName(); // Note though outer local variables must be final. }}; |
或者,可以链接返回
1 2 3 4 5 | myName = foo .bar() .reset(true) .getName(); |
其中
但是,想要这样做往往表明该对象没有足够丰富的行为。尝试重构到被调用的类。也许有不止一个班级试图离开。
使用Java 8 lambdas可以非常接近,但缺点是无法修改局部变量。
声明此方法:
1 2 3 | static <T> void with(T obj, Consumer<T> c) { c.accept(obj); } |
所以你可以使用:
1 2 3 4 5 6 7 8 9 10 11 12 | 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 }); |
这也可以使用匿名类,但不是很干净。
某些对象允许您"链接"方法调用,这会接近您喜欢的语法。例如,通常构建器类将从方法返回自己,因此您可以执行以下操作:
1 | MyObject b = new MyBuilder().setFoo(5).setBar(6).setBaz("garply!").build(); |
每个
不。 Java的政策是避免任何可能降低冗长程度的事情。
好吧,在写完这篇文章之后,我发现最接近的东西可能是静态导入,例如
1 2 3 4 5 6 | package a.b.c.d; public class Foo { public static void bar() { ... } } |
现在你可以做到
1 2 3 4 | package d.e.f; import static a.b.c.d.Foo.*; bar(); |
最接近这一点的是静态导入,它允许您在不显式指定方法所在的类的情况下调用静态方法。
如前所述,您无法在Java中真正编写代码。
就像评论一样,如果你害怕在需要更改变量名的情况下复制/粘贴很多,Eclipse允许你自动重命名变量的所有引用:
在"foo"变量名称上使用ALT + SHIFT + R,您可以一次将所有名称重命名为"myFoo":
1 2 3 | Foo myFoo = new Foo(); myFoo.bar(); myFoo.reset(true); |