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