2012-10-08 44 views
1

假设我有一个POJO User,我添加一些静态方法做CRUD操作:静态方法在Java中继承

public class User { 
    private String name; 
    private int age; 

    // getter and setter omitted 
    // 
    public static void add(User user) { 
     // add person 
    } 

    public static int delete(Object id) { 
     // delete person 
     return 1; 
    } 
} 

因为我有其他实体,如用户,所以我想使adddelete抽象的方法,像这样;

public class?interface Entity<T>{ 
    static add(T t); 
    static delete(Object id); 
} 

public class User extends Entity<User>{ 
    @override 
    static add(User user){ 
     // add ... 
    } 

    .... 
} 

这可能吗?

回答

2

不要让CRUD方法在实体静类,创建一个通用的DAO接口,然后为每个实体类型实现具体的DAO类。

不要对这种情况使用静态方法。更好的OOP方法是使用Dependency Injection框架,该框架仅创建每个具体DAO类的一个实例以节省内存和时间(一次又一次创建新的DAO实例),并在您的应用程序中需要的所有位置重用这些实例访问它们。

public interface Dao<T> { 

    // you can customise these signatures by your needs 
    // these are just my suggestions 

    T get(long id); 

    List<T> getAll(); 

    T add(T t); 

    T update(T t); 

    void delete(T t); 
} 

public class UserDao implements Dao<User> { 

    public User get(long id) { ... } 

    public List<User> getAll() { ... } 

    public User add(User user) { ... } 

    public User update(User user) { ... } 

    public void delete(User user) { ... } 
} 
+0

我认为这比将数据库代码混合到POJO中好得多。当我最后使用这种模式时,我将数据库连接传递给DAO中实现的方法。 – Thorn

8

不,这是不可能的。

首先,您不能在接口中定义静态方法。请参阅discussion

其次,您不能覆盖static方法。请参阅discussion

我不确定你的要求,如果适用,我会建议把它们作为实例方法,并允许每个类提供它自己的实现(如波希米亚人所建议的)。

1

您不能覆盖静态方法,但没有充分的理由说明这些方法应该是静态的。让他们实例方法:

的接口应该是这样的:

public interface Entity<T> { 
    T getId(); 
    void add(); 
    int delete(); 
} 

有了实现:

public void add() { 
    // add "this" 
} 

public int delete() { 
    // delete "this" 
    return 1; 
} 

此代码模式是很常见的 - 我已经看到了很多次 - 和它的作品好。


如果你不想使用实例方法,你可以在一个实用程序类来处理这样的对象创建静态方法:

public class DaoUtil { 

    public static <T> void add(Entity<T> entity) { 
     // some impl 
    } 

    public static <T> int delete(Class<? extends Entity <T>> clazz, T id) { 
     // some impl 
    } 
}