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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2361863/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-29 20:46:46  来源:igfitidea点击:

How do I restrict object creation not more than 3 in Java class?

javadesign-patterns

提问by user284211

How do I restrict object creation not more than 3 in Java class?

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

Can you give me an idea of how I can to do it?

你能告诉我我该怎么做吗?

回答by Sanjeev Kamal

We can restrict the creation of Object for a particular class by little modification in Singleton design pattern as below:

我们可以通过在单例设计模式中稍加修改来限制为特定类创建对象,如下所示:

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);
      }
}

Output of above code is like:

上面代码的输出是这样的:

com.pack2.LimitClass@19821f
com.pack2.LimitClass@addbf1
com.pack2.LimitClass@42e816
com.pack2.LimitClass@42e816
com.pack2.LimitClass@42e816
com.pack2.LimitClass@42e816

After creation of three different object it is repeating the same 3rd object again and again. It is not creating the different object.

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

回答by dagnelies

Instanciate your class via a factory (see design patterns) and limit it to 3 instances using a simple counter.

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

回答by Padmarag

You need Modified Singleton. See this - same OOPS (Design Patterns)

你需要修改单例。看到这个 - 相同的OOPS(设计模式)

回答by fastcodejava

Factory pattern is the way to go. Or a static counter can be used. Need to careful about thread safety.

工厂模式是要走的路。或者可以使用静态计数器。需要注意线程安全。

回答by extraneon

You can also have a look at ObjectPoolof Apache Commons. The source code is freely available...

您还可以查看Apache Commons 的ObjectPool。源代码是免费提供的...

回答by Hanzala Ali

why not assign limInstance=null ; in else case in getLimInstance() ? in that case it will not provide obj3 duplicates ?

为什么不分配 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);
  }

}

}

Result was this :

结果是这样的:

come.classinstance.InstanceClass@4a5ab2

come.classinstance.InstanceClass@4a5ab2

come.classinstance.InstanceClass@1888759

come.classinstance.InstanceClass@1888759

come.classinstance.InstanceClass@6e1408

come.classinstance.InstanceClass@6e1408

null

空值

null

空值

null

空值

come.classinstance.InstanceClass@6e1408

come.classinstance.InstanceClass@6e1408

回答by Yogesh Rathi

You need to modify singleton and create three objects.ans write three method in every method return object like as return different three objects and use when you needed. it main use no need to declare variable or object as static, because always return same object.

您需要修改单例并创建三个对象。在每个方法返回对象中编写三个方法,就像返回不同的三个对象并在需要时使用。它主要用于不需要将变量或对象声明为静态,因为总是返回相同的对象。

回答by Sachin Bansal

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