java - 在 Java 中创建主类的静态单例是不好的编程习惯吗?
问题描述
我正在考虑使用 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;
}
}
解决方案
虽然使用设计模式通常有助于清理编程,但在不必要的情况下过度使用它们会导致代码过于复杂。
如果您想创建应用程序的单例,则声明一个类或更好的枚举包含将由您的主函数运行的应用程序会更有益。
使用枚举:
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。缺点是通过使用序列化仍然可以多次实例化该类。
推荐阅读
- java - 如何在我的 java 程序中为每次运行更改一个变量
- javascript - 在开发中,输出故障排除代码仅适用于标准页面加载,ajax 存在问题
- javascript - 将数据传递给子视图
- python - Python Scrape of Wikipedia table 然后导出到 csv
- nginx - 为 Kubernetes 入口保留客户端源 IP?
- mariadb - 备份 MariaDB 时态数据库
- c++ - 类对象未正确修改其他类对象
- java - Bing Visual Search API (v7) 不返回图像响应
- python - 搜索和比较来自两个不同 csv 文件的数据
- api - 将 fetch() 与 API 一起使用