(Mis)私有构造函数和静态方法的使用(Java)?

(Mis)私有构造函数和静态方法的使用(Java)?,java,constructor,static,refactoring,private,Java,Constructor,Static,Refactoring,Private,我目前正在做一个需要重构的项目(它不是我写的,原始开发人员也不在)。我在该应用程序中看到,相当多的类只有私有构造函数和一个或多个静态方法(当前类对象的getter/setter)。它们也有非静态方法。我举一个例子: 类UndoManager,用于管理在应用程序上执行的撤消/重做操作。它只有私有构造函数。加载应用程序时,将调用UndoManager.setManager()。此方法从文件加载撤消历史记录,或使用专用构造函数构造新历史记录 稍后,每个类都可以使用syngronized静态方法.get

我目前正在做一个需要重构的项目(它不是我写的,原始开发人员也不在)。我在该应用程序中看到,相当多的类只有私有构造函数和一个或多个静态方法(当前类对象的getter/setter)。它们也有非静态方法。我举一个例子:

类UndoManager,用于管理在应用程序上执行的撤消/重做操作。它只有私有构造函数。加载应用程序时,将调用UndoManager.setManager()。此方法从文件加载撤消历史记录,或使用专用构造函数构造新历史记录

稍后,每个类都可以使用syngronized静态方法.getManager()访问UndoManager的这个实例

代码:

public class UndoManager extends SimpleObservable<UndoManager> {

    private static UndoManager instance;
    private final Stack<Action> undoHistory;
    private final Stack<Action> redoHistory;    

    public synchronized static void setManager(UndoManager undoManager) {
        UndoManager instance = getManager();
        instance.clear();
        instance.undoHistory.addAll(undoManager.undoHistory);
        instance.redoHistory.addAll(undoManager.redoHistory);
        instance.notifyObservers(instance);
    }

    public synchronized static UndoManager getManager() {
        if (instance == null)
            instance = new UndoManager();
        return instance;
    }

    private UndoManager() {
        this.undoHistory = new Stack<Action>();
        this.redoHistory = new Stack<Action>();
    }
    /.../
}
public类管理器扩展了SimpleObservable{
私有静态管理器实例;
私人最终记录;
私有最终堆栈历史记录;
公共同步静态void setManager(UndoManager UndoManager){
UndoManager实例=getManager();
instance.clear();
instance.undowhistory.addAll(undoManager.undowhistory);
instance.redoHistory.addAll(undoManager.redoHistory);
实例.通知观察员(实例);
}
公共同步静态撤消管理器getManager(){
if(实例==null)
实例=新的管理器();
返回实例;
}
私人物业经理(){
this.undoHistory=新堆栈();
this.redoHistory=新堆栈();
}
/.../
}
在这个应用程序中,多个类都是这样使用的。它们不是助手类,而是应该只有一个实例的类

我的问题是: 这种方式好吗?如果没有,您将如何重构该类及其访问权限

我很抱歉,如果这是一个重复,但我已经在stackoverflow和谷歌搜索了一段时间,但不知何故,我没有找到一个令人满意的答案。谢谢您的帮助。

这看起来像是一场灾难。 这是一个伟大的设计模式家族的一部分,你可能知道他们


这一点是为了确保在整个应用程序中只使用该对象的一个实例。实际上,当您调用
getManager()
时,它将在第一次返回一个新实例,下一次它将返回以前创建的实例。

这是一个调用的设计模式。它是一个延迟加载,例如用于管理器类和服务类。它们适用于需要一个实例但只有一个实例的类


通常有一种方法来获取实例,比如
getManager
方法,还有一种私有构造函数,比如你的方法,它被称为Singleton设计模式。它有它自己的时刻,但通常只是一种懒惰的方式。因此,由于实例是静态的,所以只能有一个。我不明白为什么要将undoManager传递给setManager,然后再去获取相同的实例。看起来它是在某个阶段被重构的(不是完全重构的)。但第一条规则是,如果它没有坏,就不要试图修复它。它坏了吗?@Karthik T你提到过它通常是一种懒惰的解决方法-请你详细说明一下好吗?@RebaneLumes至少在我以前工作过的地方,我们没有基于所有权的对象继承权,而是每个类有一个单例,只是为了更容易访问。在下一个项目中,我们修复了这个问题,但是它导致了大量的
getXXX().getYYY().getZZZ().setA(b)
,但这给了我们更干净的代码和更大的自由度来做与单例模式不兼容的事情。寓意:你可能需要偶尔使用,但要小心过度使用。(其他更聪明的人在这个问题上谈得更多,简单地用谷歌搜索“单身不良”可能就足够了)