Java 将共享类似函数的单例类重构为基类-泛型问题
我正在尝试重构一些共享重复代码的请求管理器类:Java 将共享类似函数的单例类重构为基类-泛型问题,java,android,Java,Android,我正在尝试重构一些共享重复代码的请求管理器类: public class PayoutChargesManager<T> extends BaseManager<T>{ private static PayoutChargesManager instance = null; public static synchronized PayoutChargesManager getInstance() { if (instance == nul
public class PayoutChargesManager<T> extends BaseManager<T>{
private static PayoutChargesManager instance = null;
public static synchronized PayoutChargesManager getInstance() {
if (instance == null) {
instance = new PayoutChargesManager();
}
return instance;
}
}
public class PayoutChargesInDayManager<T> extends BaseManager<T> {
private static PayoutChargesInDayManager instance = null;
public static synchronized PayoutChargesInDayManager getInstance() {
if (instance == null) {
instance = new PayoutChargesInDayManager();
}
return instance;
}
}
public class OrdersHistoryManager<T> extends BaseManager<T> {
private static OrdersHistoryManager instance = null;
public static synchronized OrdersHistoryManager getInstance() {
if (instance == null) {
instance = new OrdersHistoryManager();
}
return instance;
}
}
如何正确地实现这一点
new BaseManager()
创建BaseManager
的实例,因为T不是实际类型。在尖括号之间需要有一些实际的类型。另一种方法是使用newbasemanager()
实例化原始类型BaseManager
,但这会破坏泛型的用途,并可能导致一些可怕的错误我将使BaseManager抽象并从中删除
getInstance()
。您仍然可以让您的子类继承它的常见行为,但是在其中包含getInstance()
方法充其量是令人困惑的,充其量是不正确的。您可能将其过度复杂化了。首先,类型参数T
在static
方法的上下文中不可用,因此您永远不能在基类中编写通用的static
getInstance()
方法
此外,您正试图维护BaseManager
的一个实例(即其子类型)-当这些子类型中的一个占据实例
引用时,其他子类型会发生什么情况
您最好使用
getInstance
方法abstract
(因此是非静态的),并让子类型提供自己的实现(不过,您将失去单一性)。或者编写一个名为Managers
的工厂类,如果您打算维护管理器的单例实例,它将始终获取其客户机的单例实例。您在这里试图重构什么?您的目标是在BaseManager
中有一个getInstance
方法,该方法应被其所有子类重用并支持泛型吗?@mystarrocks是的,我的目标是在BaseManager中有一个getInstance
方法供其他管理者使用。好的,听起来很公平。感谢您的解释。使getInstance()
非静态意味着不使用Singleton模式,因为您需要一个Singleton实例来调用getInstance()
。啊,是的,我应该注意。编辑我的帖子。
public class BaseManager<T> implements OnApiCallListener {
private static BaseManager<T> instance = null;
public static synchronized BaseManager<T> getInstance() {
if (instance == null) {
instance = new BaseManager()<T>;
}
return instance;
}
}