java - 在不使用单例的情况下将类限制为一个实例?

标签 java singleton

我不想使用单例,但我不能允许我的类有多个实例。

您认为这是一种好方法吗?如果不是,什么是更好的方法?

public class SoundSystem {

    private static boolean instanceCreated = false;

    public SoundSystem() {
        if(instanceCreated) {
            throw new IllegalStateException("Only one instance can be created.");
        }

        instanceCreated = true;
    }
}

最佳答案

一个单例,即使您没有以“传统”方式强制执行它。我不推荐这种方法,我认为你应该找到另一种方法。

例如,为什么不在程序启动时创建单个 SoundSystem 实例?您无需明确强制其单一性,只需将该实例传递给需要访问声音系统的其他对象即可。作为奖励,如果有一天您需要它,这还可以让您轻松地放弃对不同类型的 SoundSystem 的支持(一个不错的小额外好处,即使您不需要这个)。

最重要的是,如果您尝试初始化多个 SoundSystem,OpanAL 初始化本身会失败吗?如果不是,那么就没有理由设置人为限制。如果是这样,那么您可以让 OpanAL 确定什么是错误,什么不是错误。但无论如何,如果您只是简单地创建一个实例并将其传递出去,而不是让您的所有应用程序类自己查询该实例,那将不会有风险。

小心你不要掉进XY Problem困在这里。单例并非天生邪恶,但出于某种原因,他们经常被滥用,因此一般建议反对他们。通常有一种更清洁的方法,而这些更清洁的方法通常会带来很多额外的好处。想想您正在尝试解决的实际问题/您正在尝试避免的情况。

关于java - 在不使用单例的情况下将类限制为一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22724547/

相关文章:

java - 如何在没有 Controller 类的情况下对 spring mvc 拦截器进行单元测试

Java 线程 : Specifying what should be executed in the run function

python - 在 Python 中与 Singleton 共享 Declarative_Base (SQLAlchemy)

c++ - Singleton 类中的初始化和清理

c# - 依赖注入(inject)与服务位置

java - Windows 批处理 & java : Combining -XX:OnOutOfMemoryError command and batch parameters

java - OWASP html sanitizer - 为什么它不转义某些实体?

java - 访问Java Singleton私有(private)成员的正确方法

java - 在 Java 类中频繁使用相同的字符串作为 Map 键

java图形用户界面和逻辑