是否有Java等价于Javascript';什么是陈述?

是否有Java等价于Javascript';什么是陈述?,java,javascript,with-statement,Java,Javascript,With Statement,在Java中是否有类似的方法来声明with语句(就像在Javascript中一样),或者是否存在无法实现这一点的结构性原因? 例如,此Javascript: with(obj) { getHomeworkAverage(); getTestAverage(); getAttendance(); } …很好,很简单。但是,在Java中,似乎每次方法调用都必须链接到它们的对象,没有这样优雅的快捷方式: obj.getHomeworkAverage(); obj.getTestAver


在Java中是否有类似的方法来声明with语句(就像在Javascript中一样),或者是否存在无法实现这一点的结构性原因?

例如,此Javascript:

with(obj)
{
  getHomeworkAverage();
  getTestAverage();
  getAttendance();
}
…很好,很简单。但是,在Java中,似乎每次方法调用都必须链接到它们的对象,没有这样优雅的快捷方式:

obj.getHomeworkAverage();
obj.getTestAverage();
obj.getAttendance();
这是非常多余的,当有许多方法需要调用时,尤其令人恼火。


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

不,Java中没有with语句或类似的构造。

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


obj.getHomeworkAverage().getestAverage().getAttention()

在Java中不能这样做是有原因的。也许最明显的是函数不是Java中的一级对象,因此不能简单地用一个名称来引用函数——它必须位于类之下。正如Karthik T所提到的,缩短这段时间的方法可能只是创造性地使用空格:

obj
    .meth1()
    .meth2()
    .meth3()
其中每个方法都返回对象


有关第一类函数的更多信息:

没有与“with”直接等价的词

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

{
  Student s = student;
  s.getHomeworkAverage();
  s.getTestAverage();
  s.getAttendance();
}
如果方法是静态的,则可以使用“导入静态”:

那么,在Java中有没有类似的方法来声明with语句呢

不,没有。最接近的是Patricia Shanahan回答中描述的
导入静态
机制

如果这是不可能的,那么与在Java中不可能相比,在Javascript中可能的原因是什么


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

你用
with
语句做什么?你知道,在JS中,如果可能的话最好不要使用它,这是99%的情况。我很喜欢它,它使编写几个方法调用变得很容易(虽然这并不经常发生)。顺便说一句,
with
是Javascript的“坏东西”之一-谢谢@Chris,因此,我从上面的链接中看到,Douglas Crockford表明在with语句中分配变量是不明确和不可预测的,因此应该避免。另外,Crockford在p。书中的110段Javascript:好的部分。请看以下代码片段:。我为import static创建了一个小小的helper方法+1,这可能是与
最相似的方法了+1感谢@Patricia,我以前从未听说过使用
import static
。Oracle建议尽量少用它,说当从几个不同的类导入以了解哪个方法来自哪个类时,可能会造成混淆(请参阅)。但是,我可以看到它非常有用,特别是在导入如您所示的
Math
类时。@IanCampbell我认为对于支持它的语言中的“with”也应该发出同样的警告。+1
import static
也适用于枚举。这非常棒,非常有趣,非常有用,谢谢@Karthik。我对此进行了研究,并在这里找到了一个很好的例子:是的,我知道Java和Javascript是完全不同的语言。+1感谢链接,这很有趣。+1这是一个完全正确、直截了当的答案。
import static java.lang.Math.*;

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