1

假设我有一个 POJO User,我添加了一些静态方法来执行 CRUD 操作:

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

由于我有像用户这样的其他实体,所以我想让addanddelete方法抽象,就像这样;

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 ...
    }

    ....
}

这可能吗?

4

3 回答 3

8

不,这是不可能的。

首先你不能在接口中定义静态方法。看到这个讨论

其次,您不能覆盖static方法。请参阅此讨论

我不确定您的要求,如果适用,我建议将它们保留为实例方法并允许每个类提供它自己的实现(如 Bohemian 建议的那样)。

于 2012-10-08T00:36:59.937 回答
2

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

不要在这种情况下使用静态方法。一种更好且更 OOP 的方法是使用依赖注入框架,该框架仅创建每个具体 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) { ... }
}
于 2012-10-08T00:47:22.613 回答
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
    }
}
于 2012-10-08T00:39:45.140 回答