将接口的类​​信息存储在散列映射中,稍后再创建该实例

时间:2014-08-06 18:47:10

标签: java

我希望HashMapString作为键,以及表示实现ICommand的类的值。我想这样做,因为我想将命令作为字符串,检查该命令是否存在(在HashMap中加载),创建该命令的实例,然后运行它。我知道TypeType可以代表任何类,而不是实现我的界面的东西。到目前为止,我有以下内容:

我知道我可以使用开关,但它很难看,可能会在以后添加自定义命令。

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

1 个答案:

答案 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);

添加类的实例