【问题标题】:Restricting a class to a certain amount of objects in Java在Java中将一个类限制为一定数量的对象
【发布时间】:2016-03-07 20:30:23
【问题描述】:

我想问一下是否有办法限制某个类生成超过一定数量的实例。如果可以使编译器(“Eclipse”)在该行下划线,当您尝试创建另一个实例时(例如代码中的错误),或者类似这些行的东西?

只是为了澄清那些会说这是一个坏主意的人,我正在制作一个国际象棋游戏,所以我需要它不能制作超过一定数量的棋子。

【问题讨论】:

    标签: java class instances


    【解决方案1】:

    Eclipse 无法在编译时执行此操作,因为它无法判断一段代码将执行多少次,从而创建了多少个实例。

    但是您可以设计您的类以仅创建给定数量的实例,并使其无法创建更多实例。例如:

    public class Limited {
        public static final List<Limited> ALL_INSTANCES = 
            Collections.unmodifiableList(createInstances());
    
        private int id;
    
        private static List<Limited> createInstances() {
            List<Limited> result = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                result.add(new Limited(i));
            }
        }
    
        private Limited(int id) {
            this.id = id;
        }
    }
    

    由于构造函数是私有的,只有 10 个可用实例是 ALL_INSTANCES 中的实例。

    也就是说,这不一定是个好主意。假设您正在创建一个国际象棋游戏。所以按照你的逻辑,你应该不能创建超过 2 个 King 实例。如果您的应用一次处理 10 个游戏会怎样?你真的想要最多 2 个国王,还是只希望每个 ChessGame 实例都有一个黑色和一个白色的国王?也许你所需要的只是

    public class ChessGame {
        private King blackKing = new King(BLACK);
        private King whiteKing = new King(WHITE);
        ...
    }
    

    【讨论】:

    • 谢谢,我确定我做对了,我在类本​​身中创建对象,由于私有构造函数,我无法在类之外创建对象?
    • 是的,但是您应该阅读我的答案的附录。大多数时候,这样做并不是一个好主意。
    【解决方案2】:

    您可以简单地创建所需数量的对象 - 比如说通过在循环中实例化您的类,然后设置一个由构造函数检查的标志,以便在尝试创建更多对象时抛出异常。您可以将构造函数设为私有并使用静态方法来生成实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多