Java создает максимум 3 объекта класса - PullRequest
0 голосов
/ 25 июля 2010

Когда мы хотим создать только один объект класса, мы используем шаблон проектирования Singleton.Я хочу создать максимум 3 или 5 объектов моего класса.Есть ли способ ограничить максимальное количество созданных объектов в Java?

Ответы [ 5 ]

6 голосов
/ 26 июля 2010

Конечно, вы могли бы реализовать одиночную функцию довольно легко, но то, что вы, очевидно, ищете, это Object Pool .

Существует много реализаций таких пулов, примечательным является apache commons / pool

1 голос
/ 26 июля 2010

Как уже упоминал seanizer, вы бы реализовали что-то, что уже было сделано, но, если у вас есть только один класс, который вас беспокоит, добавление нового jar-файла и использование его для такой тривиальной операции кажется мне излишним.

Простой подход состоит в том, чтобы иметь массив из n (3-5) и иметь частный конструктор в вашем классе "singleton". Тогда у вас будет метод instanceOf, который является единственным способом получить объект.

Этот метод проверяет, является ли количество созданных объектов

Но что вы хотите сделать, если все объекты уже выданы?

Вы должны быть уверены, что объект будет возвращен обратно в пул, когда вы закончите с ним, в противном случае у вас закончатся объекты для раздачи.

Когда вы раздаете объект, вы можете скопировать его в коллекцию или массив, чтобы узнать, что он уже отсутствует, или просто иметь массив с логическим значением n, равным true, когда объект доступен для передачи. вне.

Основной дизайн прост, сложность заключается в том, как обрабатывать условия, которые могут быть ошибочными, в остальной части вашей программы.

Кроме того, вам необходимо убедиться, что вы используете блок finally для возврата объекта обратно, чтобы в случае исключения объект все еще возвращался.

0 голосов
/ 26 июля 2010

Может быть, вы ищете Многотонный образец

0 голосов
/ 26 июля 2010

Вот мой друг Триплтон, он может вам помочь, его двоюродный брат Куинтон довольно понятен:

Edit:

удален плохой код, чтобы кто-то не мог его использовать, очевидно шутка была совершенно неочевидна

0 голосов
/ 26 июля 2010

Наличие в классе статического поля, которое подсчитывает количество раз, когда был создан экземпляр.

class Foo {
  private static Integer num_instances = 0, MAX = 3;
  public Foo() throws Exception {
    synchronized(Foo.num_instances) {
      if(Foo.num_instances > MAX) throw new Exception();
      Foo.num_instances++;
    }
  }
}

РЕДАКТИРОВАТЬ: вероятно, это плохая форма - генерировать исключение из конструктора, поэтому вместо этого вы можете сделать следующее:

class Foo {
  private static Integer num_instances = 0, MAX = 3;
  public Foo try_to_get_a_new_foo() {
    synchronized(Foo.num_instances) {
      if(Foo.num_instances > MAX) return null;
      Foo.num_instances++;
      return new Foo();
    }
  }
}

РЕДАКТИРОВАТЬ 2: Если вы хотите объединить (максимальное количество в памяти в любой момент времени), просто реализуйте finalize ():

class Foo {
  private static Integer num_instances = 0, MAX = 3;
  public Foo try_to_get_a_new_foo() {
    synchronized(Foo.num_instances) {
      if(Foo.num_instances > MAX) return null;
      Foo.num_instances++;
      return new Foo();
    }
  }
  public void finalize() {
    synchronized(Foo.num_instances) {
      Foo.num_instances--;
    }
    super.finalize();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...