假设我有一个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这样的其他实体,所以我希望抽象出add
和delete
方法,就像这样;
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 ...
}
....
}
这可能吗?
答案 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
}
}