关于vb.net:WITH语句在Java中

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


或者,可以链接返回this的方法:

1
2
3
4
5
myName =
    foo
        .bar()
        .reset(true)
        .getName();


其中barreset方法返回this


但是,想要这样做往往表明该对象没有足够丰富的行为。尝试重构到被调用的类。也许有不止一个班级试图离开。



使用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();


每个set...方法返回this,以便您可以链接下一个调用。



不。 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);