编写一个java类,只创建它的五个实例

Kam*_*mal 3 java design-patterns

我想编写一个只能实例化5次的java类,就像你只有一个实例的单例类一样.

除此之外,应以循环方式选择实例.

假设我有一个A类.我应该只能创建这个类的5个实例.假设我有InstanceA_1,InstanceA_2,InstanceA_3,InstanceA_4,InstanceA_5.每当我需要使用它们时,应该循环选择它们.

pol*_*nts 14

正如Effective Java 2nd Editionenum推荐实现单例,这个解决方案也用来实现... quadrupleton?enum

import java.util.*;

public enum RoundRobin {
    EENIE, MEENIE, MINY, MO;

    private final static List<RoundRobin> values =
        Collections.unmodifiableList(Arrays.asList(values()));
    // cache it instead of creating new array every time with values()

    private final static int N = values.size();
    private static int counter = -1;

    public static RoundRobin nextInstance() {
        counter = (counter + 1) % N; // % is the remainder operator
        return values.get(counter);
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(RoundRobin.nextInstance());
        }
        // EENIE, MEENIE, MINY, MO, EENIE, MEENIE, MINY, MO, ...
    }
}
Run Code Online (Sandbox Code Playgroud)

将其扩展到五元组是不言自明的.

也可以看看

  • 有效的Java第二版,使用私有构造函数或枚举类型强制执行单例属性

    从版本1.5开始,有第三种方法来实现单例.只需使用一个元素创建一个枚举类型.这种方法在功能上等同于公共字段方法,除了它更简洁,免费提供序列化机制,并提供防止多实例化的铁定保证,即使面对复杂的序列化或反射攻击.虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方法.

相关问题

  • 对不起,我应该更清楚哪个部分我认为线程安全:).public static RoundRobin nextInstance()此方法正在对int进行非同步访问.当然,多个线程最终可能会选择相同的实例. (2认同)