Случайный выбор из кучи классов в Java - PullRequest
3 голосов
/ 12 июля 2011

У меня проблема с лучшей техникой в ​​Java.У меня есть базовый класс, реализующий некоторые общие методы.Куча унаследованных классов.Теперь мне нужно случайным образом выбрать один из унаследованных классов.Мой подход заключается в следующем:

  1. Наличие массива объекта Class для каждого унаследованного класса
  2. Произвольная генерация индекса для массива
  3. Создайте экземпляр объекта class со случайным индексом из 2. с помощью newInstance ()

Пример кода для шага 1:

Class[] possibleClasses = {Class1.class, Class2.class}

Это достаточный подход?Например, исправление синтаксиса Eclipse Indigo говорит для приведенного выше примера кода: «Класс является необработанным типом. Ссылки на универсальный тип Class должны быть параметризованы».То есть определение без универсального типа может иметь побочные эффекты или около того?

Stefan

Ответы [ 4 ]

2 голосов
/ 12 июля 2011

Поскольку никто не вставил это в ответ, я скажу: используйте List. Массивы не подходят для универсальных типов.

List<Class<? extends MyBaseClass>> possibleClasses = Arrays.asList(Class1.class, Class2.class);

Перед Java 7 это выдаст безопасное предупреждение:

Unchecked generics array creation for varargs parameter.

Это может быть безопасно проигнорировано или подавлено, или вы можете вместо этого сделать это:

List<Class<? extends MyBaseClass>> possibleClasses = new ArrayList<...>();
possibleClasses.add(Class1.class);
//...

И тогда вы можете сгенерировать случайный индекс и использовать possibleClasses.get(i).

2 голосов
/ 12 июля 2011

Ваш подход хорош - действительно, это, вероятно, самый простой и эффективный подход.

Если вы хотите избежать предупреждения компилятора, вы можете добавить аргумент универсального типа следующим образом:

Class<?>[] possibleClasses = new Class[]{Class1.class, Class2.class}

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

Несколько более сложный альтернативный подход состоит в использовании отражения для обхода иерархии классов и автоматического добавлениявсе подклассы вашего базового класса в ArrayList классов.Преимущество состоит в том, что вам не нужно явно перечислять все подклассы по отдельности, и он будет автоматически подбирать все новые добавленные подклассы.

1 голос
/ 12 июля 2011
Class<? extends Collection>[] klazzes =
  (Class<Collection>[]) new Class[]{ List.class, Set.class };
0 голосов
/ 12 июля 2011

Ладно, людям, кажется, очень трудно придумать код. Вы должны сделать что-то вроде этого:

Class<?>[] cls = {Class1.class, Class2.class};
Random r = new Random();
Class<?> = cls[r.nextInt(cls.length)];

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...