是否有一个Java等同于Javascript的声明?

Is there a Java equivalent to Javascript's with statement?

本问题已经有最佳答案,请猛点这里访问。


是否有类似的方式在Java中声明一个with语句(如在Javascript中),或者是否存在结构性原因导致无法实现这一点?


例如,这个Javascript:

1
2
3
4
5
6
with(obj)
{
  getHomeworkAverage();
  getTestAverage();
  getAttendance();
}

......很好,也很容易。 但是,似乎每次在Java中都必须将方法调用链接到它们的对象,没有这样的优雅快捷方式:

1
2
3
obj.getHomeworkAverage();
obj.getTestAverage();
obj.getAttendance();

这是非常多余的,当有许多方法可以调用时尤其令人恼火。


  • 那么,有没有类似的方法在Java中声明一个with语句?
  • 如果这是不可能的,那么与Javascript相比,Javascript中可能的原因是什么?


没有直接等同于"with"。

如果方法是实例方法,则可以为目标对象引用提供在块中使用的短标识符:

1
2
3
4
5
6
{
  Student s = student;
  s.getHomeworkAverage();
  s.getTestAverage();
  s.getAttendance();
}

如果方法是静态的,则可以使用"import static":

1
2
3
4
5
6
7
import static java.lang.Math.*;

public class Test {
  public static void main(String[] args) {
    System.out.println(sqrt(2));
  }
}


不,Java中没有声明或类似的构造。


如果obj的类在您的控制之下,您可以提供Fluent接口,基本上在每个函数中返回this。这可以让你像这样链接方法调用 -

obj.getHomeworkAverage().getTestAverage().getAttendance();


有一个原因你不能用Java做到这一点。也许最明显的是函数不是Java中的第一类对象,因此您不能简单地使用引用该函数的名称 - 它必须位于类之下。正如Karthik T所提到的,缩短它的方式可能只是创造性地使用空白:

1
2
3
4
obj
    .meth1()
    .meth2()
    .meth3()

每个方法返回对象的位置。

有关First-Class Functions的更多信息:wikipedia


So, is there any similar way to declare a with-statement in Java?

不,那里没有。最接近的是Patricia Shanahan的回答中描述的import static机制。

And if this is not possible, what are the reasons that it is possible in Javascript as compared to not possible in Java?

它们是两种完全不同的语言,具有不同的特征/优点/缺点。类比:锤子和螺丝刀都是工具,但它们以不同的方式使用。