java - Java 中的静态外观

标签 java design-patterns

我有这个基本代码

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 现在允许这样做)。

如果你设法输入getInstancefind在公共(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/

相关文章:

php - 工厂方法的建议

design-patterns - 迭代类型列表

java - 使用 Eclipse 中的 ObjectAid 插件在 UML 图中表示 map

c# - 如何用设计模式改进多态性

asp.net-mvc - 如何在 ADO.NET 中使用存储库和工作单元模式?

c++ - 循环依赖和图

java - 使用流将 Java 列表转换为映射,其中映射中的每个值共享相同的属性

java - java中用simplexml反序列化xml

java - 使用 ORMLite 从 SUM 中获取 REAL 的方法是什么

java - 通过导航到 bin 目录解决从命令行启动 Apache Tomcat 的麻烦