Java如何管理用户定义的变量

时间:2016-07-19 21:28:22

标签: java generics wildcard

我正在开发一些软件,我希望允许用户创建和管理自己的变量。我想让用户能够创建双精度,整数和字符串,然后手动设置它们的值(所有这些都将通过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

有没有人有任何想法或经验可以很好地解决这个问题?感谢您的任何意见。

2 个答案:

答案 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;
}