java - 在java中创建主类的静态单例是不好的编程习惯吗?

标签 java static mainclass

我正在考虑使用 Singelton 设计模式并创建我的主类的 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;
}
}

最佳答案

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

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

使用枚举:

public enum Application{
    instance;

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

这样做的效果是,即使通过序列化,应用程序也无法复制,而且您也无法使用接口(interface)来概括您的应用程序。

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

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

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

    private Application(){}

    public Application getApplication(){
        return instance;
    }

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

此变体的优点是该类仍然可以实现接口(interface)或扩展类,例如可运行。 缺点是通过使用序列化,该类仍然可以多次实例化。

关于java - 在java中创建主类的静态单例是不好的编程习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61307490/

相关文章:

java - 如何从 Angular 获取HTTP id并将其发送到java?

java - Java中静态变量的用法——对象永远不会改变

java - "Error: Could not find or load main class com.mycompany.App"尝试执行 Maven 生成的 Jar

java - 如何使用 LambdaMetaFactory 在运行时创建代理对象?

java - .NET 等同于 Java 的 List.subList()?

c++ - 如何从类中初始化数组并将值设置为第一个元素?

c - 在这种情况下比较字符串指针是否有效?

java - 为什么ant Manifest任务会分割长主类名?

java - ClassNotFoundException : org. springframework.context.support.AbstractApplicationContext

java - 将动态数据从位于多个 div 下的多个表中的 JSP 页面导出到 Excel