我希望HashMap
以String
作为键,以及表示实现ICommand
的类的值。我想这样做,因为我想将命令作为字符串,检查该命令是否存在(在HashMap
中加载),创建该命令的实例,然后运行它。我知道Type
但Type
可以代表任何类,而不是实现我的界面的东西。到目前为止,我有以下内容:
我知道我可以使用开关,但它很难看,可能会在以后添加自定义命令。
public class Commands
{
// will register commands later
HashMap<String, Type> _commands;
public void parseCommand(String command)
{
String[] args = command.split("\\s+");
if (args.length > 0 && _commands.containsKey(args[0]))
{
// should create instance of _commands[args[0]] here
}
}
// will load commands dynamically later
public interface ICommand
{
public String getCommandName();
public void execute(String args);
//public void printHelp();
}
public class HelpCommand implements ICommand
{
public String getCommandName()
{
return "help";
}
public void execute(String args)
{
System.out.println("help - print help");
System.out.println("exit - quit the server");
System.out.println("register username password - creates user");
}
}
public class ExitCommand implements ICommand
{
public String getCommandName()
{
return "exit";
}
public void execute(String args)
{
// todo save state, log out users, etc.
System.exit(0);
}
}
}
答案 0 :(得分:2)
Map<String, Class<? extends ICommand>> map;
Class<? extends ICommand> type = map.get("someCommand");
ICommand command = type.newInstance();
command.execute();
听起来你应该存储Class
而不是Type
。通过限制地图来保存Class
延伸ICommand
的实例,我相信你拥有你想要的东西。
除了以上所述之外,您可能还想考虑存储Class实例的工厂实例。 interface ICommandFactory { ICommand createNewInstance();}
。
根据Pacha
,您可以使用map.put("someKey", SomeConcreteClass.class);