Java中的静态外观

时间:2015-01-14 15:25:30

标签: 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(...) }
}

但我有很多这些方法,并希望将它们全部移动到某个共享基类。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

方法既不能是静态的,也不能是可覆盖的。而且你不能在接口中声明静态方法(由于上述原因)。至少对于8以下的所有Java版本(感谢Giovanni Botta注意到Java 8现在允许这样做。)

如果你设法将getInstancefind放在一个公共基类中,因为Java通过类型erasuse实现泛型,你将无法在find中从中获取正确的子类你将实际获得(单例)实例。

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

假设您有一个当前使用UserDAO.find的课程。您可以在通过DI初始化的类型SquallDAO<T>中声明对象,例如:

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

通过这种方式,您可以从公共基类(可能是服务...)中正确调用find,Java可以调用正确的查找实现。

您可以在实现DI模式(如SpringFramework或Java EE

)的框架中找到更多详细信息