在 Java DOM/AST ( http://help.eclipse.org/indigo/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-tree.html ) 中,为什么初始化程序包含 block 以及为什么方法调用是表达式而不是语句?
我的意思是,给出代码
int a = Integer.parseInt("1");
ASTView 插件仅向我显示 INITIALIZER > MethodInitation
是否存在真正具有 Block 元素的初始化程序?
此外,如果我有这样的方法
public void thisMethod(){
System.out.println();
}
方法调用被包装到表达式语句中。但为什么 MethodInspiration 不是一条语句呢?只是一个简单的 System.out.println() 就是一个有效的“语句”。 Java DOM/AST 意义上的表达式缺乏独立的能力。
也许我只是没有完全理解表达式和语句之间的分离。
最佳答案
AST 树旨在反射(reflect)编程语言的语法规则。
从语法上讲,初始化程序由一个 block 组成, block 前面有一个可选的static
修饰符。因此,这是最自然的实现,具有由 Block
和修饰符(继承自 BodyDeclaration
)组成的 Initializer
类。所以我不明白你为什么质疑它。
初始化示例:
class Foo {
static {
System.out.println("static initializer");
System.out.println("class Foo now initialized");
}
{
System.out.println("instance initializer");
System.out.println("an instance of Foo has been created");
}
}
<小时/>
表达式和语句是两种不同的语法结构。有些地方只允许使用表达式或语句。但也有像方法调用这样的构造,它们是表达式语句,这意味着它们可以同时满足表达式和语句的角色。它们可以因其副作用而单独调用,但也可以在需要值的地方调用。
但是由于 Java 不允许多重继承,因此您无法创建同时继承 Expression
和 Statement
的 AST 类 ExpressionStatement
。因此,您需要一种类似于 Eclipse AST 中的解决方案,其中 ExpressionStatement
继承自一个并包装另一个。决定继承哪一个以及包装哪一个很容易:您可以创建一个 Statement
实现(子类),它会删除它所包装的 Expression
的结果,但您不能创建一个 Expression
实现,为通过其接口(interface)不提供结果的 Statement
提供结果。这种实现的替代方法是使用接口(interface)。
关于Java DOM/AST - 为什么 MethodInspiration 是一个表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19816481/