Java:只允许一个类实例化

标签 java constructor

我希望汇集项目中的某些类。所以我不希望能够使用 new SomeClass() 来实例化这些类,而是使用 SomeClass.allocate() 从池中获取一个新项目。 对于需要池化的每个类,我都有这种代码。

public class GameObject
{
    // Pooling: Provides a static method for allocation and a method for freeing
    private static Pool<GameObject> pool = new Pool<GameObject>();
    public static GameObject allocate() { return pool.obtain(); }
    public void free() { pool.free(this); }
    ...
}

现在我可以通过将默认构造函数设为私有(private)来禁用正常的实例化方式,但问题是池需要在创建时实例化类,并且在池需要扩展时也需要实例化。

有什么方法可以限制只能在泳池边施工吗?

最佳答案

我可以看到您有 2 个选项:要么将其设为池的内部类,要么将 allocate 方法设为包私有(private)并将其与池放在同一个包中。

编辑:啊。只需将构造函数设为私有(private),然后覆盖 Pool 用于创建新实例的任何方法。作为使用上面框架的(粗略)示例:

public abstract class Pool<T>
{
    public abstract T getNewObject();

    public T obtain(){ return getNewObject(); }

    public void free(T obj) {}
}

public class GameObject
{
    // Pooling: Provides a static method for allocation and a method for freeing
    private static Pool<GameObject> pool = new Pool<GameObject>(){
          public GameObject getNewObject(){ return new GameObject(); }
    };
    public static GameObject allocate() { return pool.obtain(); }
    private GameObject(){}
    public void free() { pool.free(this); }
}

GameObject 的构造函数很高兴其他任何人都无法访问。

关于Java:只允许一个类实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7129797/

相关文章:

java - 无法在java中列表的最后一个值之后删除逗号

java - 在 Java 中编写带有清理操作的 catch block

c++ - 使用构造函数将双链表中的指针初始化为 NULL

java - Activity 变灰并有两个按钮可供选择

java - 速度模板转换成java字符串

c++ - 结构上没有合适的默认构造函数

javascript - 仅返回对象文字的构造函数如何工作?

c++ - 为什么调用析构函数

c++ - C2440 无法从 'void (_cdecl*)(int)' 转换为 'void(_cdecl&)(int)

java - 哪个是适用于 Android 的最佳线平滑算法