gpt4 book ai didi

java - Java 中的静态外观

转载 作者:行者123 更新时间:2023-12-01 12:01:38 25 4
gpt4 key购买 nike

我有这个基本代码

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com