有两种方法可以原生地做到这一点,还有一种不那么原生的方式。
选项1
你所拥有的是选项 1,它大部分是正确的,你只是使用了错误的比较方式。比较你的
public void processArgument(Instruction info) {
// this is bad - uses reference comparison
if (info.command == "read")
int value = manager.read(info.objectName);
}
与推荐
public void processArgument(Instruction info) {
// this is good - actually compares the values
if (info.command.equals("read"))
int value = manager.read(info.objectName);
}
有些人会认为执行以下操作会更好,因为如果info.command
为 null,则不会引发异常。就我个人而言,我不喜欢这样,因为我宁愿获得例外,但很多人提倡它,他们有一个完全正当的理由这样做。
public void processArgument(Instruction info) {
// "read" can never be null, so no null pointer exception here
if ("read".equals(info) )
int value = manager.read(info.objectName);
}
当然,当您添加更多行为时,您只需添加更多 if 语句。
在 Java 7 中,您可以这样做:
public void processArgument(Instruction info) {
switch(info.command) {
case "read": manager.read(info.objectName); break;
case "write": manager.write(info.objectName); break;
default: throw new IllegalArgumentException("Command " + info.command + " not supported");
}
}
选项 2
另一种选择是使用利用匿名类的 Map,如下所示:
// define this somewhere
abstract class Functor {
Manager m;
Functor(Manager m) { this.m = m; }
void execute(Instruction info);
}
// somewhere you have access to
Map<String,Functor> funcs = new HashMap<String,Functor>();
// add this to a static block, or constructor, depending
funcs.put("read", new Functor(manager) {
public void execute(Instruction info) { m.read(info.objectName); }
});
funcs.put("write", new Functor(manager) {
public void execute(Instruction info) { m.write(info.objectName); }
}
然后当你打电话给你的论点
public void processArgument(Instruction info) {
Functor f = funcs.get(info.command);
if(f == null) throw new IllegalArgumentException("Operation " + info.command + " not supported");
f.execute(info);
}
选项 3
使用反射作为 SagarDabas 在他的帖子中概述的内容。请注意,这可能需要特殊的访问权限,并且不会为您提供灵活的正确性选项。