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

Java 使用共享接口/基类实例化子类的更好方法,java,Java,我是Java新手,所以这很容易。我有一系列子类,它们与一个接口共享大多数变量/方法,但每个子类都有一些特定于其类型的附加方法,这就是我以这种方式设计代码的原因 然而,当我从数据库中检索数据时(对于我拥有的每个子类,数据都以相同的格式存储),我希望能够创建基类的实例,或者可以轻松地将其转换为我需要的子类,或者使用某种工厂来给我一个子类实例 这就是我现在拥有的代码,它只是检查数据的类型,然后创建子类的新实例,但我觉得它太重复了 还有更好的吗 if( rs.getStr

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

如果您可以使用工厂模式方法来创建类的实例,效果会更好

请查看此链接


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

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

您正在创建的对象是否有多个构造函数?它们是否有一个默认(空)构造函数以及一个接受8个参数的构造函数(如您所示)?它们在每个子类中都有两个不同的构造函数。没有空的默认构造函数。每个类中的多个构造函数是否相同?