Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java类中限制对象创建不超过3个?_Java_Design Patterns - Fatal编程技术网

如何在Java类中限制对象创建不超过3个?

如何在Java类中限制对象创建不超过3个?,java,design-patterns,Java,Design Patterns,如何在Java类中限制对象创建不超过3个 你能告诉我怎么做吗?通过工厂实例化你的类(参见设计模式),并使用一个简单的计数器将其限制为3个实例。你需要修改单例。请看这一点-同样的工厂模式是一条路要走。或者可以使用静态计数器。需要注意线程安全。您还可以查看ApacheCommons。源代码免费提供…我们可以通过对Singleton设计模式进行少量修改来限制特定类对象的创建,如下所示: public class LimitClass { private static LimitClass l

如何在Java类中限制对象创建不超过3个


你能告诉我怎么做吗?

通过工厂实例化你的类(参见设计模式),并使用一个简单的计数器将其限制为3个实例。

你需要修改单例。请看这一点-同样的工厂模式是一条路要走。或者可以使用静态计数器。需要注意线程安全。

您还可以查看ApacheCommons。源代码免费提供…

我们可以通过对Singleton设计模式进行少量修改来限制特定类对象的创建,如下所示:

public class LimitClass {

    private static LimitClass limInstance;
    public static int objCount = 0;

    private LimitClass(){
        objCount++;
    }

    public static synchronized LimitClass getLimInstance(){
        if(objCount < 3 ){
            limInstance = new LimitClass();
        }
        return limInstance;
    }
}

public class LimitObjectCreationTest {

    public static void main(String[] args) {

        LimitClass obj1 = LimitClass.getLimInstance();
        LimitClass obj2 = LimitClass.getLimInstance();
        LimitClass obj3 = LimitClass.getLimInstance();
        LimitClass obj4 = LimitClass.getLimInstance();
        LimitClass obj5 = LimitClass.getLimInstance();
        LimitClass obj6 = LimitClass.getLimInstance();

        System.out.println(obj1);
        System.out.println(obj2);

        System.out.println(obj3);
        System.out.println(obj4);
        System.out.println(obj5);
        System.out.println(obj6);
      }
}

在创建三个不同的对象后,它会一次又一次地重复相同的第三个对象。它没有创建不同的对象。

为什么不分配limInstance=null;在其他情况下,在getLimInstance()中?在这种情况下,它不会提供obj3副本吗

 public static synchronized InstanceClass getLimInstance()
{
        if(objCount < 3 ){
            limInstance = new InstanceClass();
        }
        else
        {
            limInstance=null;
        }
        return limInstance;
    }


public class LimitObjectCreationTest {


   public static void main(String[] args) {
    InstanceClass obj1 = InstanceClass.getLimInstance();
    InstanceClass obj2 = InstanceClass.getLimInstance();
    InstanceClass obj3 = InstanceClass.getLimInstance();
    InstanceClass obj4 = InstanceClass.getLimInstance();
    InstanceClass obj5 = InstanceClass.getLimInstance();
    InstanceClass obj6 = InstanceClass.getLimInstance();

    System.out.println(obj1);
    System.out.println(obj2);

    System.out.println(obj3);
    System.out.println(obj4);
    System.out.println(obj5);
    System.out.println(obj6);

    System.out.println(obj3);
  }
公共静态同步InstanceClass getLimInstance()
{
如果(对象计数<3){
limInstance=新InstanceClass();
}
其他的
{
limpinstance=null;
}
返回实例;
}
公共类限制ObjectCreationTest{
公共静态void main(字符串[]args){
InstanceClass obj1=InstanceClass.getLimInstance();
InstanceClass obj2=InstanceClass.getLimInstance();
InstanceClass obj3=InstanceClass.getLimInstance();
InstanceClass obj4=InstanceClass.getLimInstance();
InstanceClass obj5=InstanceClass.getLimInstance();
InstanceClass obj6=InstanceClass.getLimInstance();
系统输出打印项次(obj1);
系统输出打印项次(obj2);
系统输出打印LN(obj3);
系统输出打印LN(obj4);
系统输出打印LN(obj5);
系统输出打印LN(obj6);
系统输出打印LN(obj3);
}
}

结果是:

来吧,康斯坦斯。InstanceClass@4a5ab2

来吧,康斯坦斯。InstanceClass@1888759

来吧,康斯坦斯。InstanceClass@6e1408

空的

空的

空的


来吧,康斯坦斯。InstanceClass@6e1408

您需要修改singleton并创建三个对象。在每个方法中写入三个方法返回对象,就像返回不同的三个对象一样,并在需要时使用。无需将变量或对象声明为静态,因为始终返回相同的对象。

如果要将类实例限制为N,请继续创建新实例并将其添加到集合中,直到集合的大小小于N。否则,将随机返回N个实例中的任意一个

public class LimitClass {
    private static List<LimitClass> ObjectPool = new ArrayList<LimitClass>();
    public static int objCount = 0;
    private static Random randomizer = new Random();
    private LimitClass(){
        objCount++;
    }
    public static synchronized LimitClass getLimInstance(){
        if(objCount < 3 ){
            LimitClass lc = new LimitClass();
            ObjectPool.add(lc);
            return lc;
        }
        return ObjectPool.get(randomizer.nextInt()%3);
    }
}

public class LimitObjectCreationTest {
    public static void main(String[] args) {
        LimitClass obj1 = LimitClass.getLimInstance();
        LimitClass obj2 = LimitClass.getLimInstance();
        LimitClass obj3 = LimitClass.getLimInstance();
        LimitClass obj4 = LimitClass.getLimInstance();
        LimitClass obj5 = LimitClass.getLimInstance();
        LimitClass obj6 = LimitClass.getLimInstance();
        System.out.println(obj1);
        System.out.println(obj2);
        System.out.println(obj3);
        System.out.println(obj4);
        System.out.println(obj5);
        System.out.println(obj6);
        System.out.println(obj3);  
    }
}




    LimitClass@1788a393
    LimitClass@460c2da6
    LimitClass@4283a56d
    LimitClass@460c2da6
    LimitClass@1788a393
    LimitClass@4283a56d
    LimitClass@4283a56d
公共类{
私有静态列表ObjectPool=new ArrayList();
公共静态int objCount=0;
私有静态随机发生器=新随机();
私有类(){
objCount++;
}
公共静态类getLimInstance(){
如果(对象计数<3){
LimitClass lc=新的LimitClass();
ObjectPool.add(lc);
返回信用证;
}
返回ObjectPool.get(randomizer.nextInt()%3);
}
}
公共类限制ObjectCreationTest{
公共静态void main(字符串[]args){
LimitClass obj1=LimitClass.getLimInstance();
LimitClass obj2=LimitClass.getLimInstance();
LimitClass obj3=LimitClass.getLimInstance();
LimitClass obj4=LimitClass.getLimInstance();
LimitClass obj5=LimitClass.getLimInstance();
LimitClass obj6=LimitClass.getLimInstance();
系统输出打印项次(obj1);
系统输出打印项次(obj2);
系统输出打印LN(obj3);
系统输出打印LN(obj4);
系统输出打印LN(obj5);
系统输出打印LN(obj6);
系统输出打印LN(obj3);
}
}
LimitClass@1788a393
LimitClass@460c2da6
LimitClass@4283a56d
LimitClass@460c2da6
LimitClass@1788a393
LimitClass@4283a56d
LimitClass@4283a56d

您指的是erm、tripleton设计模式吗?比如,一堂课有三个实例?我不明白你的问题到底是什么……这似乎是某门课程中常见的家庭作业/问题。我已经多次看到这个问题(几乎总是数字为3),但我还没有看到这个限制的好理由。如果这是作业,我们可以添加作业标签吗?简单的静态计数器并同步工厂方法。当回答一个旧问题时,如果您包含一些上下文来解释您的答案是如何帮助的,那么您的答案对其他StackOverflow用户会更有用。请参阅:。
public class LimitClass {
    private static List<LimitClass> ObjectPool = new ArrayList<LimitClass>();
    public static int objCount = 0;
    private static Random randomizer = new Random();
    private LimitClass(){
        objCount++;
    }
    public static synchronized LimitClass getLimInstance(){
        if(objCount < 3 ){
            LimitClass lc = new LimitClass();
            ObjectPool.add(lc);
            return lc;
        }
        return ObjectPool.get(randomizer.nextInt()%3);
    }
}

public class LimitObjectCreationTest {
    public static void main(String[] args) {
        LimitClass obj1 = LimitClass.getLimInstance();
        LimitClass obj2 = LimitClass.getLimInstance();
        LimitClass obj3 = LimitClass.getLimInstance();
        LimitClass obj4 = LimitClass.getLimInstance();
        LimitClass obj5 = LimitClass.getLimInstance();
        LimitClass obj6 = LimitClass.getLimInstance();
        System.out.println(obj1);
        System.out.println(obj2);
        System.out.println(obj3);
        System.out.println(obj4);
        System.out.println(obj5);
        System.out.println(obj6);
        System.out.println(obj3);  
    }
}




    LimitClass@1788a393
    LimitClass@460c2da6
    LimitClass@4283a56d
    LimitClass@460c2da6
    LimitClass@1788a393
    LimitClass@4283a56d
    LimitClass@4283a56d