允许创建的类别只有' n'对象数量

时间:2014-03-17 05:57:53

标签: java

这个问题类似于单身人士,但我需要创建一个可以允许' n'仅限对象数,下面是我的代码

  public class MSInt {

    private static MSInt instance = null;

    private static int count = 0;

    private MSInt()
    {

    }


    public static MSInt getInstance()
    {
        if(count < 5){
            instance = new MSInt();
             count++;
             return instance;
        }
        else
        {
            return null;
        }

    }

}

这是有效的,但我正在考虑比这更好的解决方案。

5 个答案:

答案 0 :(得分:2)

我认为这将是一种更清洁的方式。你不需要任何柜台。 它看起来还不错。

import java.util.ArrayList;

public class MSInt {

    private static int MAX_OBJS = 10;

    private static ArrayList<MSInt> instances = new ArrayList<MSInt>(MAX_OBJS);

    private MSInt() {}

    public static MSInt mkInstance() {
        if(instances.size() < MAX_OBJS){
            MSInt obj = new MSInt();
            instances.add(obj);
            return obj;
        } else {
            return null;
        }
    }

    public static ArrayList<MSInt> getInstances() {
        return instances;
    }

}

答案 1 :(得分:0)

您的准则是:

        private static MSInt instance = null;

这是覆盖方法; 像这样使用数组:

       private static MSInt[] instance = null;

并使用for循环:

  for(int i=0;i<5;i++)
   {
        instance[i] = new MSInt();
        return instance[i];
   }

答案 2 :(得分:0)

我建议你使用装饰模式

所以创建一个类LimitedList<T> extends AbstractList<T>并覆盖add方法,以检查是否超出了大小

我已将代码here (gist)

答案 3 :(得分:0)

使用数组或集合意味着垃圾收集不会在您不知情的情况下删除任何实例,这意味着您可以在以后检索实例(如果需要)。使用an MSInt[]可能是最实用的,因为它已经能够确保其中只存在一定数量的对象。然后getInstance()方法循环遍历数组,如果它找到一个空槽,则创建一个新实例,将其放入空白点并返回结果。

public class MSInt {

    private static MSInt[] instances = new MSInt[10];

    private MSInt(){ }

    public synchronized static MSInt getInstance() /*throws TooManyException*/{          
        for(int i = 0 ; i<instances.length() ; i++){
             if(instances[i]==null){
                 MSInt ms = new MSInt();
                 instances[i] = ms;
                 return ms;  
             }
        }
        // throw new TooManyException("There are already 10 instances of MSInt");
        return null;          
    }
}

某些异常处理也可能有用。您可以抛出自定义异常以显示已存在太多实例。这将使以后更易于管理,因为如果阵列已经满了,您可以定义更强大的自定义行为。通过删除上面的类中的注释并创建下面的类,这应该很好地工作。

public class TooManyException extends Exception {

  public TooManyException(String message){
     super(message);
  }

}

希望这有帮助。

答案 4 :(得分:0)

很少有建议:

  1. public static MSInt getInstance()替换为public static MSInt getInstance(int number)。这样,您每次都可以指定要获得的对象。
  2. 定义实例之间的差异。您的实例具有哪些属性?在您的示例中,所有对象看起来都相同 - 不清楚为什么您需要多个对象。
  3. 考虑初始化。您是否需要延迟初始化,或者是否可以在类初始化中初始化所有实例。然后,您可以声明它们public static final并拒绝定义getInstance()
  4. BTW,enum是具有n个实例(按设计)的类。将MSInt定义为enum很可能对您来说最方便。