繁体   English   中英

从 JAVA 中的父 class 返回子 class 的新实例

[英]Return new instance of child class from parent class in JAVA

我一直在研究 ORM。想要一个功能,其中任何扩展 DbModel class 的孩子 class 将能够使用父 class 中的所有 static 方法。但是,大多数 static 方法返回 Parent11111818181819 的实例
有什么办法可以让哪个孩子 class 从这些方法中获得自己的实例?


DbModel.java -> 访问数据库

public class DbModel {

     public DbModel(String tableName)
     {
     }

    public static DbModel findById(String tableName , String id){
        //some logic ....
        return new DbModel(tableName);
    }

    public static DbModel findByValue(String tableName ,String value){
        //some logic ....
        return new DbModel(tableName);
    }
    
}

Users -> users class 其中包含用户逻辑。 同样,会有很多类。

public class Users extends DbModel {


    public Users() {
        super("users");
    }

    //some method
    public String getFullName(){
        //some logic
        return "fullname";
    }


}

测试Test.java -> 测试 class

public class Test {

    public static void main(String[] args) {

        //--> ERROR : DbModel cannot be cast to Users
        Users users = Users.findById("","");
        //what I want : Users.findById should return Users type not DbModel



    }

}

您可以添加一个参数,让您指定要返回的类型以绑定 generics,然后只需调用该类型的适当构造函数。

public class DbModel {

    public DbModel(String tableName) { ...}

    public static <T extends DbModel> T findById(
            String tableName, String id, Class<T> type
    ) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

        //stuff

        return type.getConstructor(String.class).newInstance(tableName);
    }

}

这里检查异常的数量应该告诉你这不是最安全或最可维护的编码方式。 您应该考虑改用https://en.wikipedia.org/wiki/Abstract_factory_pattern

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM