静态方法在java中继承

时间:2012-10-08 00:34:08

标签: java inheritance override

假设我有一个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;
    }
}

由于我有像User这样的其他实体,所以我希望抽象出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 ...
    }

    ....
}

这可能吗?

3 个答案:

答案 0 :(得分:8)

不,这是不可能的。

  

首先,您无法在界面中定义静态方法。见discussion

     

其次,您无法覆盖static方法。请参阅此discussion

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

答案 1 :(得分: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) { ... }
}

答案 2 :(得分: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
    }
}