使用共享接口/ baseclass实例化子类的更好方法

时间:2013-01-01 07:09:05

标签: java

我是Java的新手,所以这很容易。我有一系列子类,它们通过接口共享大多数变量/方法,但是每个子类都有一些其他类型独特的方法,这就是我用这种方式设计代码的原因。

然而,当我从数据库中检索数据时(数据以我所拥有的每个子类的相同格式存储)我希望能够创建一个基类的实例或者我可以轻易地转换的东西到我需要的子类或者有某种工厂给我一个子类实例。

这是我现在的代码,它只检查数据的类型,然后创建子类的新实例,但它对我来说感觉如此重复。

还有什么更好的吗?

                if( rs.getString("action_type").equals("block-break") || rs.getString("action_type").equals("block-place") ){
                actions.add( new BlockAction(
                        rs.getString("action_time"),
                        rs.getString("action_type"),
                        rs.getString("world"),
                        rs.getString("player"),
                        rs.getInt("x"),
                        rs.getInt("y"),
                        rs.getInt("z"),
                        rs.getString("data")
                    ) );
            }

            if( rs.getString("action_type").equals("entity-kill") ){
                actions.add( new EntityKillAction(
                        rs.getString("action_time"),
                        rs.getString("action_type"),
                        rs.getString("world"),
                        rs.getString("player"),
                        rs.getInt("x"),
                        rs.getInt("y"),
                        rs.getInt("z"),
                        rs.getString("data")
                    ) );
            }

2 个答案:

答案 0 :(得分:3)

我不知道你问题中的actions是什么,但这里有一种方法可以避免重复并获得更简单的代码。

BaseAction baseAction ; // super class
String actionType = rs.getString("action_type"); 
if (actionType.equals("block-break") || actionType.equals("block-place")) {
   BlockAction blockAction = new BlockAction(); // create instance for sub class
   blockAction.set() // set sub class attributes here
   baseAction = blockAction ;

} else if (actionType.equals("entity-kill")) {
   EntityKillAction entityKillAction =new EntityKillAction(); //another subClass
   entityKillAction.set() 
   baseAction = entityKillAction;
}
//set all super class atributes for all
baseAction.setActionTime(rs.getString("action_time"));
baseAction.setActionType(rs.getString("action_type")) ;
// similarly set for all attributes  
actions.add(baseAction);

答案 1 :(得分:0)

如果您可以使用工厂模式方法创建类的实例,那就更好了。

请查看此链接

Java Patterns