【发布时间】:2012-03-05 18:53:34
【问题描述】:
我正在为 Java 中的外部程序制作一个新的脚本生成器。这种语言支持变量,但它是一种无类型语言。这是我最初编写的代码示例:
public class Var
{
private String name;
private String type;
private float defaultValue;
private float lowerBound;
private float upperBound;
private float value;
private LinkedList<Float> valuesConstraint;
private String description;
private Category category;
private LinkedList<CvarDependency> dependencies;
...
}
var 类型通常是 Float,但也可以是 bool [0|1]、String 或 int。 所以我最终做出了这个实现:
abstract class Var
{
private String name;
...
}
public class IntVar extends Var
{
private int value;
private int defaultValue;
private int lowerBound; //-infinite
private int upperbound; //+infinite
...
}
public class FloatVar extends Var
{
private float value;
private float defaultValue;
private float lowerBound; //-infinite
private float upperbound; //+infinite
...
}
public class StringVar extends Var
{
private String value;
private String defaultValue; //empty string
...
}
public class BoolVar extends Var
{
private boolean value;
private boolean defaultValue;
private boolean lowerBound; //false <-> 0
private boolean upperbound; //true <-> 1
...
}
现在我必须将这些变量存储到 LinkedList 中,但是当我必须阅读其内容时,如何管理正确的转换?我读到使用这种方法不是一个好习惯:
Var var = Manager.getVar("namevar");
if( var.getClass().getName().equals("StringVar") )
...
else if( var.getClass().getName().equals("IntVar") )
...
else if( var.getClass().getName().equals("FloatVar") )
...
else if( var.getClass().getName().equals("BoolVar") )
...
有什么提示可以更好地处理这个问题吗?
【问题讨论】:
-
我会为每个
Var建议一个Visitor模式。这样,访问者就知道如何进行投射。 -
好的,这就是我需要的模式。请将此评论作为答案发布,以便我可以将其放在回复堆栈的顶部!
-
可以使用 instanceOf 运算符吗?
-
当然可以,但我想要一个“干净”的实现!