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

时间:2013-08-19 07:56:37

标签: java constructor static refactoring private

我目前正在开发一个需要重构的项目(它不是由我编写的,原始的开发人员不在身边)。我在该应用程序中看到,相当多的类只有私有构造函数和一个或多个静态方法(当前类对象的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>();
    }
    /.../
}

在这个应用程序中,使用了多个类。它们不是辅助类,而是应该只有一个实例的类。

我的问题是: 这种访问风格好吗?如果没有,你将如何重构课程并进行访问?

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

2 个答案:

答案 0 :(得分:2)

这看起来像singleton pattern。 它是你可能认识它们的伟大家族设计模式的一部分。

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

答案 1 :(得分:1)

这是一种名为Singleton的设计模式。它是一个懒惰的负载,例如用于管理器类和服务类。它们适用于您想要实例但只有一个实例的类。

通常有一种方法来获取像getManager方法这样的实例和像你一样的私有构造函数