我正在尝试定义一个类(或一组实现相同接口的类),它将表现为松散类型的对象(如 JavaScript)。它们可以保存任何类型的数据,对它们的操作取决于底层类型。
我让它以三种不同的方式工作,但似乎都不理想。这些测试版本只允许字符串和整数,唯一的操作是加法。添加整数导致整数值的总和,添加字符串将字符串连接起来,将整数添加到字符串会将整数转换为字符串并将其与字符串连接。最终版本将拥有更多类型(Doubles、Arrays、可以动态添加新属性的类 JavaScript 对象)和更多操作。
方式一:
public interface DynObject1 {
@Override public String toString();
public DynObject1 add(DynObject1 d);
public DynObject1 addTo(DynInteger1 d);
public DynObject1 addTo(DynString1 d);
}
public class DynInteger1 implements DynObject1 {
private int value;
public DynInteger1(int v) {
value = v;
}
@Override
public String toString() {
return Integer.toString(value);
}
public DynObject1 add(DynObject1 d) {
return d.addTo(this);
}
public DynObject1 addTo(DynInteger1 d) {
return new DynInteger1(d.value + value);
}
public DynObject1 addTo(DynString1 d)
{
return new DynString1(d.toString()+Integer.toString(value));
}
}
...和 DynString1 类似
方式二:public interface DynObject2 { @Override public String toString(); 公共 DynObject2 添加(DynObject2 d);}
public class DynInteger2 implements DynObject2 {
private int value;
public DynInteger2(int v) {
value = v;
}
@Override
public String toString() {
return Integer.toString(value);
}
public DynObject2 add(DynObject2 d) {
Class c = d.getClass();
if(c==DynInteger2.class)
{
return new DynInteger2(value + ((DynInteger2)d).value);
}
else
{
return new DynString2(toString() + d.toString());
}
}
}
...和 DynString2 类似
方式3:
public class DynObject3 {
private enum ObjectType {
Integer,
String
};
Object value;
ObjectType type;
public DynObject3(Integer v) {
value = v;
type = ObjectType.Integer;
}
public DynObject3(String v) {
value = v;
type = ObjectType.String;
}
@Override
public String toString() {
return value.toString();
}
public DynObject3 add(DynObject3 d)
{
if(type==ObjectType.Integer && d.type==ObjectType.Integer)
{
return new DynObject3(Integer.valueOf(((Integer)value).intValue()+((Integer)value).intValue()));
}
else
{
return new DynObject3(value.toString()+d.value.toString());
}
}
}
使用 if-else 逻辑,我可以使用 value.getClass()==Integer.class 而不是存储类型,但是对于更多类型,我会更改它以使用 switch 语句,并且 Java 不允许 switch 使用类。
无论如何......我的问题是做这样的事情的最好方法是什么?