假设我有一个不可变对象(immutable对象)的层次结构,例如编程语言的表达式
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;
//...
}
现在,为了在某些特殊情况下使用此层次结构的对象,我希望对它们有不同的(不可变的) View 。例如,我们可以有一个 View SimpleSum
其中有一个特殊的equals
这使得a + 0
和0 + a
和a
等于或 View SimpleProduct
与 a * 1
执行类似的操作和1 * a
和a
.
我现在实现它的方式是每个 View 的静态方法,例如
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
}
由于可能有许多不同的 View 和算法(例如,映射流中的所有“可 View ”,同时保持“不可 View ”不变),这些 View 和算法不依赖于 View 的确切类型,我希望有一些通用方法喜欢 public static <E> Optional<E> viewAs(Expression e)
或public static <E> boolean isViewableAs(Expression e)
在一些助手类中。不幸的是,到目前为止我还没有成功(我唯一可行的想法是从 View 的构造函数中抛出异常,但我觉得这不够漂亮)。
有没有办法在一般的 Java 中实现类似的东西?
最佳答案
您可以尝试使用 java 覆盖。
例如:
public class Sum extends Expression {
public final Expression child1;
public final Expression child2;
public Optional calculateSumm () {
// perform simple calclation
}
//...
}
public class SimpleSum extends Sum {
public Optional calculateSumm () {
// perform simple calculation
}
}
public class complexSum extends Sum {
public Optional calculateSumm () {
// perform complex calculation
}
}
//--
现在在主类中:
public static void main (String[] args) {
SimpleSum simple = new SimpleSum();
ComplexSum complex = new ComplexSum();
if(isSimpleSum(e)) {
return simple.calculateSum();
} else {
return Optional.empty();
}
}
关于java - "view"不可变对象(immutable对象)特殊情况的最佳模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58392443/