我正在开发一些软件,我希望允许用户创建和管理自己的变量。我想让用户能够创建双精度,整数和字符串,然后手动设置它们的值(所有这些都将通过UI完成)。现在我正在尝试决定一个能管理所有这些用户定义变量的模型。
我的第一个想法是,让一个Map按名称获取变量并使用“一刀切”的“变量”类会很好...
Map<String, Variable> myVars;
我想将Variable类定义为这样......
public class Variable<T>
{
private T value;
public void setValue(T value)
{
this.value = value;
}
public T getValue()
{
return value;
}
}
但是,我认为这种方法要求我将地图定义为Map<String, Variable<T> >
,但我不想为整个地图选择单一类型T
,而是允许地图包含整数,双精度和字符串的组合。
第二个想法是创建一个容器类,它维护三个不同的映射,每个映射一个用于字符串,整数和双精度。三个映射与调用者绝缘,调用者只需要向getter提供String(变量名),容器将从适当的映射中获取变量的值。容器还可以处理所有三个地图中保持键的唯一性等问题。
存根可能看起来像这样......
public class VariableContainer {
private Map<String, Double> doubleVars = new HashMap();
private Map<String, String> stringVars = new HashMap();
private Map<String, Integer> intVars = new HashMap();
public Object get(String varName)
{
if (doubleVars.containsKey(varName)) {
return doubleVars.get(varName);
} else if (stringVars.containsKey(varName)) {
return stringVars.get(varName);
} else if (intVars.containsKey(varName)) {
return intVars.get(varName)
} else {
// varName not found
}
}
}
但是,现在get
方法的调用者必须使用instanceof
进行检查以确定返回了哪种对象。
就此而言,如果需要对来电者进行检查,可能最容易坚持
Map<String, Object>
并忘记抽象的Variable
类或容器类。
也许另一种选择是返回一个通配符,如本问题的答案中所述: Avoiding Returning Wildcard Types
有没有人有任何想法或经验可以很好地解决这个问题?感谢您的任何意见。
答案 0 :(得分:0)
确定以下似乎有效:
public class Variable<T>
{
private T value;
public void setValue(T value)
{
this.value = value;
}
public T getValue()
{
return value;
}
public String toString()
{
return value.toString();
}
}
Map<String, Variable<?>> myVars = new HashMap<>();
Variable<Double> v1 = new Variable<>();
v1.setValue(3.0);
Variable<String> v2 = new Variable<>();
v2.setValue("hello");
myVars.put("doubleVar", v1);
myVars.put("stringVar", v2);
System.out.println("doubleVar = " + myVars.get("doubleVar"));
System.out.println("stringVar = " + myVars.get("stringVar"));
以上版画:
doubleVar = 3.0
stringVar = hello
答案 1 :(得分:0)
你可以使用我们的功能覆盖。
class Container{
// get();
}
class StringContiner extends Container{
// get() return string;
}
class IntContainer extends Container{
// get() return return int;
}
class DoubleContainer extends Container{
// get() return double;
}