有没有Java等价于Javascript的with语句?

5
是否有类似于Javascript中的with语句在Java中声明的方式,或者这是否有结构上的限制使得这不可能呢?
例如,下面的Javascript代码:
with(obj)
{
  getHomeworkAverage();
  getTestAverage();
  getAttendance();
}

在Java中,方法调用似乎必须每次链接到它们的对象,而没有这样优雅的快捷方式:

...很好,也很容易。

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

这非常冗余,特别是在有许多方法可调用时尤其令人恼火。
那么,在Java中是否有类似于“with语句”的声明方式?
如果这不可能,那么相比于Java,它为什么在Javascript中是可能的而在Java中不可能呢?请解释原因。

你使用 with 语句是用来做什么的?你知道,在 JS 中,如果可能的话最好不要使用它,99% 的情况下都是如此。 - elclanrs
我只是喜欢它,它使得编写多个方法调用变得容易(虽然这种情况并不经常发生)。 - Ian Campbell
1
顺便提一下,with是Javascript中的“坏东西”之一 - 一些推荐阅读 - Krease
谢谢@Chris,我从上面的链接中看到Douglas Crockford表明,在with语句中分配变量是不明确和不可预测的,因此应该避免使用。此外,Crockford在书籍Javascript: The Good Parts的第110页详细解释了这一点。 - Ian Campbell
另一个解释为什么在Javascript中with语句不好的好理由是它在词法上是一种昂贵的操作(参见https://dev59.com/lXVD5IYBdhLWcg3wL4YA#1463937)。然而,许多人仍然认为`with`语句对于可读性很有用,并且当用于简化方法调用时,其开销被认为是可以忽略的。我确实明白它绝不能用于分配变量。 - Ian Campbell
1
看一下这段代码片段:https://gist.github.com/mojo2012/da4e8193d25b1cb92bf416493022a09d。我创建了一个小的辅助方法。 - mojo2012
5个回答

10

“with”没有直接的等价物。

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

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

如果方法是静态的,您可以使用“import static”:

import static java.lang.Math.*;

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

3
对于import static的+1,这可能是最接近Python中with语句的相似之处。 - Krease
1
+1 感谢@Patricia,我以前从未听说过使用 import static。Oracle 建议适度使用它,因为当从多个类中导入时,很难知道哪个方法来自哪个类(参见 http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html)。但是,我可以看到它非常有用,*尤其是*在导入 Math 类时,正如你所展示的那样。 - Ian Campbell
2
@IanCampbell 我认为在支持“with”的语言中,同样应该警告过度使用。 - Patricia Shanahan
+1 import static 也适用于枚举。 - Brian McCutchon

8

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


6
+1 这是一个完全正确、简洁明了的回答。 - Benjamin Gruenbaum

6
如果obj的类在您的控制下,您可以提供一个流畅接口(Fluent interface),基本上在每个函数中都返回this。这将使您能够链接方法调用,如下所示- obj.getHomeworkAverage().getTestAverage().getAttendance();

这太棒了,非常有趣和有用,谢谢@Karthik。我已经研究过这个,并在这里找到了一个很好的例子:http://hilloldebnath.byethost3.com/2009/08/20/implementing-the-fluent-interface-approach-in-java/ - Ian Campbell

4

为什么Java不能做到这一点?其中一个最明显的原因是Java中的函数不是一等对象,因此你无法简单地使用一个名称引用该函数 - 它必须在一个类下。正如Karthik T所提到的,缩短代码的方法可能只是创造性地使用空格:

obj
    .meth1()
    .meth2()
    .meth3()

每个方法都返回对象。

有关一等函数的更多信息:维基百科


+1 感谢提供链接,这很有趣。 - Ian Campbell

1
那么,在Java中有类似声明with语句的方式吗?
没有。最接近的可能是Patricia Shanahan答案中描述的import static机制。
如果不可能,那么相比于Java不可能,Javascript为什么可以呢?
它们是两种完全不同的语言,具有不同的特点/优势/劣势。一个比喻:锤子和螺丝刀都是工具,但它们的使用方式不同。

1
是的,我知道Java和Javascript是完全不同的语言。 - Ian Campbell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接