问题标题可能表达不佳,所以我很抱歉。我将命题逻辑公式表示为Java中的树,如下所示:
abstract class Formula { }
final class AndFormula extends Formula {
private Formula leftChild, rightChild;
public AndFormula(Formula leftChild, Formula rightChild) {
this.leftChild = leftChild;
this.rightChild = rightChild;
}
// add some getters...
}
final class OrFormula extends Formula {
private Formula leftChild, rightChild;
public OrFormula(Formula leftChild, Formula rightChild) {
this.leftChild = leftChild;
this.rightChild = rightChild;
}
// add some getters...
}
final class AtomicFormula extends Formula {
private String name;
public AtomicFormula(String name) {
this.name = name;
}
// add some getters...
}
现在让我们说我想以一种非常特殊的方式收集原子公式的名称:我只想要原子公式的名称,这些名称永远不会出现在OrFormula的右侧。我有以下内容:
public static Set<String> specialVars(Formula f) {
Set<String> ans = new HashSet<String>();
if( f.getClass() == AndFormula.class ) {
// Recursively add all special vars from the left child:
ans.addAll( specialsVar( f.leftChild ) );
// Recursively add all special vars from the right child:
ans.addAll( specialsVar( f.rightChild ) );
} else if( f.getClass() == OrFormula.class ) {
// Recursively add all special vars from the left child:
ans.addAll( specialsVar( f.leftChild ) );
// Don't add anything from the right child!
} else if( f.getClass() === AtomicFormula.class ) {
// The base case:
ans.add( f.getName() );
}
return ans;
}
这段代码似乎有效,所以我的问题是:这是惯用的Java吗?如果没有,那么编写这段代码的惯用方法是什么?是否有任何我应该注意到的意外行为?
谢谢!