Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将共享类似函数的单例类重构为基类-泛型问题_Java_Android - Fatal编程技术网

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;
      }
    }