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 现在允许这样做)。
如果您设法将 getInstance
和 find
放在公共基础 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
中找到更多详细信息
我有这个基本代码
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 现在允许这样做)。
如果您设法将 getInstance
和 find
放在公共基础 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
中找到更多详细信息