我有这个基本代码
public abstract class SquallDAO<T extends SquallBean> {
List<T> _find(String whereClause, String sortColumn, Integer lowerLimit, Integer upperLimit) throws Exception { ... }
}
class UserDAO extends SquallDAO<User> { }
我希望能够在基类 SquallDAO 中建立一个静态外观。在派生类中它工作正常:
class UserDAO extends SquallDAO<User> {
public static SquallDAO getInstance() { if ( instance != null ) return new UserDao();
}
public static find(...) { return getInstance()._find(...) }
}
但是我有很多这样的方法,并且想将它们全部移动到某个共享基类。
我怎样才能实现这个目标?我并没有接受这个解决方案,只是寻找一种优雅的方式来实现静态外观并保持继承。
谢谢!
最佳答案
方法不能既是静态的又是可重写的。并且您不能在接口(interface)中声明静态方法(由于上述原因)。至少对于低于 8 的所有 Java 版本(感谢 Giovanni Botta 注意到 Java 8 现在允许这样做)。
如果你设法输入getInstance
和find
在公共(public)基类中,由于 Java 通过类型删除实现泛型,因此您将无法 find
从您实际获取(单例)实例的地方获取正确的子类。
我知道允许将这些几乎相同的函数移动到公共(public)基类的唯一方法是摆脱单例模式,而使用依赖注入(inject)。
假设您有一个当前使用 UserDAO.find
的类。您可以在 SquallDAO<T>
类型的类中声明一个对象。通过 DI 初始化,例如:
SquallDAO<T> dao;
// setter for DI omitted
...
List<T> l = dao.find(...);
这样就可以正确调用 find
来自公共(public)基类(可能是服务...),Java 能够调用正确的查找实现。
您将在 SpringFramework 等实现 DI 模式的框架或 Java EE 中找到更多详细信息
关于java - Java 中的静态外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27946446/