【问题标题】:Restrict a class to be instantiated not more than five times [duplicate]限制类实例化不超过五次[重复]
【发布时间】:2014-02-14 00:16:01
【问题描述】:

我想创建一个类的最多五个对象。如果创建了多次对象,它将引发异常。请帮忙。

【问题讨论】:

  • 闻起来像非常非常糟糕的设计。
  • 检查单例/多例模式。简而言之,将构造函数设为私有,然后创建一个静态方法来服务实例。顺便说一句,当创建超过 5 个对象时抛出异常听起来不是一个好主意...
  • 也称为multipleton。
  • 你确定它永远是 5 吗?如果几个月后你想要 7 个呢?

标签: java exception object


【解决方案1】:

创建一个静态工厂方法来跟踪创建的实例。

使用私有构造函数,用户必须使用工厂方法,如果已经创建了超过 5 个对象,则可以抛出异常。

【讨论】:

  • 一个普通的构造函数和一些静态实例计数器也可以做同样的事情。
  • 是的,但这提供了实际返回现有实例的机会(尽管 OP 确实指定了他想要一个例外,但也许他会改变主意)。
【解决方案2】:

做这样的事情:

public class VeryOddClass
{
    private static final Object lock = new Object();
    private static int s_count;

    static
    {
         s_count = 5; /*ToDo - read from configuration*/
    }

    public VeryOddClass()
    {
        synchronize(lock){            
            if (s_count <= 0) throw new VeryOddClassException();
            --s_count;
        }
        /*normality resumes from here*/

但请重新考虑您的设计要求。

【讨论】:

    【解决方案3】:

    我认为这将是此类问题的解决方案。我们需要有一个私有的静态计数器,一旦它达到期望限制,然后抛出一个异常。

    class Program
    {
        private static int instanceCount;
    
        public Program()
        {
            if (instanceCount > 5)
                throw new InvalidOperationException("Only 5 instances of Program are allowed");
            instanceCount++;
        }
    
        public static void main(String[] args)
        {
            for (int n = 0; n < 10; n++)
                new Program();
        }
    }
    

    【讨论】:

    • +1:这可能很好:我相信int是Java中的原子类型。也许我的解决方案是矫枉过正。
    【解决方案4】:

    创建一个静态私有字段并在构造函数中递增它。另外,检查那里的计数。通过 TheClassname.field++ 或其他东西增加它并通过 TheClassname.field==5 进行检查

    【讨论】:

      【解决方案5】:

      通过工厂实例化您的类,并使用简单的计数器将其限制为 5 个实例。或者使用修改后的 Singleton: OOPS (Design Patterns)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-09
        • 2011-09-09
        • 1970-01-01
        • 1970-01-01
        • 2020-07-20
        • 1970-01-01
        • 2016-08-03
        相关资源
        最近更新 更多