我有一个非常简单的基于值的类,旨在用于应用程序服务器环境。我想选择一种能够实现最佳可扩展性的设计(这些简单的类是说明性的):
标记:
public class Value {
private final long m_value;
private final boolean m_kind;
private Value(long value, boolean tag) {
this.m_value = value;
this.m_kind = tag;
}
public long getValue() { return m_value; }
public boolean kindOf() { return m_kind; }
public static Value of(long value, boolean tag) {
return new Value(value, tag);
}
}
标记的Value类是一个简单的类,没有可访问的构造函数和一个静态工厂方法,它包含一个标记m_kind
的字段,即一个描述该值的特殊属性的字段(确切地说不是对这个例子很重要)。因为这是一个标记类,所以它也可以使用继承层次结构来表示:
层次:
public abstract class Value {
private final long m_value;
private Value(long value) {
this.m_value = value;
}
public long getValue() { return m_value; }
public abstract boolean kindOf();
public static Value of(long value, boolean kind) {
return (kind)
? new TrueValue(value);
: new FalseValue(value);
}
}
和
public class TrueValue extends Value {
TrueValue(long value) { super(value); }
@Override
public boolean kindOf() { return true; }
}
和
public class FalseValue extends Value {
FalseValue(long value) { super(value); }
@Override
public boolean kindOf() { return false; }
}
从客户端的角度来看,这两个解决方案的行为完全相同。
Tagged解决方案需要一个额外的实例字段来描述对象的完整状态,而Hierarchical解决方案中的状态部分由层次结构本身描述,因此需要少一个字段(但它确实需要一个层次结构)。
在资源受限的Java服务器环境中,哪些解决方案提供了更好的可扩展性,或者差异是否太小而不重要?