Java 中的静态立面

Static Facade in Java

我有这个基本代码

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

并且我希望能够在基础 class SquallDAO 中建立静态外观。在派生的 class 中它工作正常:

class UserDAO extends SquallDAO<User> { 
     public static SquallDAO getInstance() { if ( instance != null ) return new UserDao(); 
     } 

     public static find(...) { return getInstance()._find(...) }
}

但我有很多这样的方法,我想将它们全部移动到某个共享基础 class。

我怎样才能做到这一点?我不喜欢这个解决方案,只是在寻找一种优雅的静态外观并保持继承的方式。

谢谢!

一个方法不能既是静态的又是可重写的。并且您不能在接口中声明静态方法(出于上述原因)。至少对于低于 8 的所有 Java 版本(感谢 Giovanni Botta 注意到 Java 8 现在允许这样做)。

如果您设法将 getInstancefind 放在公共基础 class 中,因为 Java 通过类型擦除实现泛型,您将无法 find 从您实际获得(单例)实例的地方获得正确的 subclass。

我知道允许将那些几乎相同的函数移动到一个公共基础的唯一方法 class 是摆脱单例模式,而是使用依赖注入。

假设您有一个 class 当前使用 UserDAO.find。您将在通过 DI 初始化的类型 SquallDAO<T> 的 class 中声明一个 object,例如:

SquallDAO<T> dao;
// setter for DI omitted
...
List<T> l = dao.find(...);

这样您就可以从公共基础 class(也许是服务...)正确调用 find,Java 能够调用正确的查找实现。

您将在实现 DI 模式的框架(如 SpringFramework)或 Java EE

中找到更多详细信息