我是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")
                    ) );
            }

最佳答案

我不知道您的问题中的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);

10-01 06:09
查看更多