Java DOM/AST - 为什么 MethodInspiration 是一个表达式?

标签 java dom abstract-syntax-tree eclipse-jdt

在 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 不允许多重继承,因此您无法创建同时继承 ExpressionStatement 的 AST 类 ExpressionStatement。因此,您需要一种类似于 Eclipse AST 中的解决方案,其中 ExpressionStatement 继承自一个并包装另一个。决定继承哪一个以及包装哪一个很容易:您可以创建一个 Statement 实现(子类),它会删除它所包装的 Expression 的结果,但您不能创建一个 Expression 实现,为通过其接口(interface)不提供结果的 Statement 提供结果。这种实现的替代方法是使用接口(interface)。

关于Java DOM/AST - 为什么 MethodInspiration 是一个表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19816481/

相关文章:

java - 检查 BinarySearchTree 中的重复值

java - 是否可以使用两个嵌套的同步块(synchronized block)来锁定数组的两个单元格以进行原子操作?

c# - 从 htmldocument :HTMLAgilityPack 中删除 html 节点

java - Spring在 "Executing identity-insert immediately"时不回滚

java - 使用信号量的监控程序在java中无法按预期工作

javascript - Angular 不会更新 DOM 但会将数据记录到控制台

javascript - JS 和 HTML - cloneNode() 不起作用

c++ - bisonc++ 多态继承

ruby - 了解 Ruby 中赋值和逻辑运算符的优先级

java - 使用 eclipse jdt/ast 内联 java 代码