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

Java how to manage user-defined variables

我正在开发一些允许用户创建和管理他们自己的变量的软件。我想让用户能够创建双精度数、整数和字符串,然后手动设置它们的值(所有这些都将通过 UI 完成)。现在我正在尝试确定一个模型来管理所有这些用户定义的变量。

我的第一个想法是,如果有一个 Map 可以通过名称获取变量并使用 "one-size-fits-all" 'Variable' class...

会很好
Map<String, Variable> myVars;

我想像这样定义变量class...

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,而是允许地图包含整数、双精度数和字符串的组合。

第二个想法是创建一个容器 class 来维护三个不同的映射,每个映射用于字符串、整数和双精度数。这三个映射与调用者隔离,调用者只需向 getter 提供一个字符串(变量名),容器就会从相应的映射中获取变量的值。该容器还可以处理诸如在所有三个映射中维护键的唯一性等问题。

存根可能看起来像这样...

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 进行检查以确定 returned 的对象类型。

关于这一点,如果需要对呼叫者进行检查,那么坚持使用

可能是最简单的方法
Map<String, Object>

忘记抽象 Variable class 或容器 class.

也许另一种选择是 return 通配符,如该问题的答案中所述: Avoiding Returning Wildcard Types

有没有人对解决这个问题的好方法有任何想法或经验?感谢您的任何输入。

确定以下似乎有效:

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 = 你好

您可以使用函数覆盖。

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