0

我正在考虑使用 Singelton 设计模式并创建我的 Main 类的 Singelton。在搜索的过程中,我发现一些评论认为这是一种相当糟糕的编程习惯,特别是因为静态方法的声明并不适合面向对象的编程。您对改进我的代码有什么建议吗?

public class MainClass {
private static MainClass instance = new MainClass();

public static MainClass getMainInstance() {
    return instance;
}

public static void main(String[] args) {
    MainClass main = Main.instance;
}
}
4

2 回答 2

1

虽然使用设计模式通常有助于清理编程,但在不必要的情况下过度使用它们会导致代码过于复杂。

如果您想创建应用程序的单例,则声明一个类或更好的枚举包含将由您的主函数运行的应用程序会更有益。

使用枚举:

public enum Application{
    instance;

    public void run(){
    //do awesome stuff
    }
}

这样做的效果是,即使通过序列化,应用程序也不能被复制,而且您也不能使用接口泛化您的应用程序。

使用普通类来实现单例时,您需要将构造函数设为私有或保护该类,否则不会再次实例化。

使用带有私有构造函数的普通类:

public class Application{
    private static final Application instance = new Application();

    private Application(){}

    public Application getApplication(){
        return instance;
    }

    public void run(){
    //do awesome stuff
    }
}

这种变体的优点是该类仍然可以实现接口或扩展类,例如 Runnable。缺点是通过使用序列化仍然可以多次实例化该类。

于 2020-04-19T16:56:30.440 回答
1

首先对于在类上实现的单例对象必须包括以下内容。

  1. 它应该将所有构造函数标记为私有。
  2. 它应该具有静态方法,该方法具有仅一次创建对象的逻辑。
  3. 它应该有静态引用类变量来保存单个可能的实例。

有了这些,我们可以确保 Singleton 对象,但这不是唯一的方法,因为我们可以使用创建设计模式或 Fly weight 设计模式来克服静态方法调用。

关于 Static 关键字,它仍然使用对象的 Class 实例。众所周知,任何对象都具有在类加载过程中在堆上创建的等效单例类对象。所以它并没有超出 OOPS。

希望这可以帮助 !!!

于 2020-04-19T16:31:45.183 回答