java帮助澄清具有通用类的工厂方法

时间:2015-07-11 23:47:57

标签: java generics static factory

老实说,我不确定这个标题是否正确;但我会尝试用例子解释我的问题。

说我有两个班级

public class Entity {
    private static int lastID = 0;
    private int ID;

    private Entity(){};

    public static Entity create(){
        lastID++;

        Entity ent = new Entity();
        ent.ID = lastID;

        return ent;
    }
}

public class Blob extends Entity {
    private int x,y;

    pubic void setPos(int X,int Y){;
        x = X;
        y = Y;
    }
}

我想与实体工厂交互的方式是

Blob b = Entity.create<Blob>();

或者那种性质的东西。

我最好的尝试是

public static <E extends Entity> E create(){
    E ent = new E();
    ...

但是这不想工作。

2 个答案:

答案 0 :(得分:1)

简单的工厂方法可能看起来像这样。将它保存在自己的类中(不在Entity类中)并在名称中的某个位置使用名称 Factory ,以便它具有上下文

public static final Entity getInstance(String id){
    Entity instance = null;
    if(id.equals("Blob")) {
        instance = new Blob();
    }
    else if(id.equals("Another Blob")) {
        instance = new AnotherBlob();
    }
    // more Entity types here
    return instance;
}

答案 1 :(得分:1)

我担心如果不将一个类或其名称作为参数传递,就无法完成。

然后,您可以使用通用构造<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>INDEX</title> <link href='css/style.css' rel='stylesheet' type='text/css'/> <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script> $(document).ready(function(){ $("#put").submit(function(event) { event.preventDefault(); $.ajax({ url: 'http://localhost/slim/reg', type: 'POST', crossDomain: true, data: $("#put").serializeArray(), success: function(data) {console.log(data); } }); }); }); </script> </head> <body> <form id="put"> Registration <br/> username: <input type="text" name="username" id="username"/><br /> password: <input type="password" name="hash" /><br /> name: <input type="text" name="name" /><br /> email: <input type="text" name="email" /><br /> <input type="submit" /> </form> </body> </html> 使其类型安全并避免手动类型转换。

<E extends Entity<E>>