【发布时间】:2019-10-15 10:22:56
【问题描述】:
假设我有一个不可变对象的层次结构,例如编程语言的表达式
public abstract class Expression {}
public class IntConst extends Expression {
public final Integer value;
// ...
}
public class Variable extends Expression {
public final String name;
//...
}
public class Sum extends Expression {
public final Expression child1;
public final Expression child2;
//...
}
public class Product extends Expression {
public final Expression child1;
public final Expression child2;
//...
}
现在,为了在某些特殊情况下使用此层次结构的对象,我希望对它们有不同的(不可变的)视图。例如,我们可以有一个视图SimpleSum,它有一个特殊的equals,它使a + 0 和0 + a 和a 相等,或者一个视图SimpleProduct,它与a * 1 和1 * a 做类似的事情,并且a.
我现在实现它的方式是每个视图的静态方法,例如
public static Optional<SimpleSum> viewAsSimpleSum(Expression e) {
if(isSimpleSum(e)) {
return Optional.of(new SimpleSum(e));
} else {
return Optional.empty();
}
}
public static boolean isSimpleSum(Expression e) {
// cascade of "instanceof" or implementation via visitor
}
由于可能存在许多不依赖于确切视图类型的不同视图和算法(例如,映射流中的所有“可见”,而“不可见”不受影响),我希望有一些通用方法像一些助手类中的public static <E> Optional<E> viewAs(Expression e) 或public static <E> boolean isViewableAs(Expression e)。不幸的是,到目前为止我还没有成功(我唯一可行的想法是从视图的构造函数中抛出异常,但我觉得这不够漂亮)。
有没有办法在一般的 Java 中实现类似的东西?
【问题讨论】:
标签: java generics design-patterns immutability