2015-12-06 2 views
0

Я хочу создать массив классов, а не объектов. Я хочу, чтобы иметь возможность получить доступ к статическим функциям каждого класса, которые имеют такое же имя, как и так:Создать массив классов в Java (а не объекты)?

for (int i = 0; i < array.length; ++i) { 
    array[i].staticMethod(); 
} 

Где массив [я] был бы синтаксический взаимозаменяем с именем класса, как Integer.

+0

Я также должен добавить базовую функцию к типу массива, например: class 'SuperClass {public static void staticMethod() {}}', но я попытался сделать это с классом класса, и он не удался из-за 'Class' объявляется' final'. – rasnauf

+3

Я должен задаться вопросом, может ли это быть [проблема XY] (http://mywiki.wooledge.org/XyProblem). Какова общая проблема, которую вы пытаетесь решить с помощью этой конструкции? –

+0

Насколько я знаю, вы не можете полиморфно обращаться к методу класса, не объявляя метод в базовом классе. Я не могу сделать это в классе. – rasnauf

ответ

0

Вы определяете массив классов, как это:

Class<?>[] classArray = new Class<?>[10]; 
+0

, но вы не можете вызвать staticMethod –

+0

Вам нужно будет использовать отражение – DBug

1

Вы на самом деле не имеют никакого выбора, кроме как использовать Classобъекты в массиве, Class<?>[] array = new Class<?>[10], а затем вызвать статический метод рефлекторно, например,

array[i].getMethod("staticMethod", ArgType1.class, ArgType2.class) 
    .invoke(null, arg1, arg2); 

Учитывая указанную цель, это самое близкое приближение, доступное на Java. Вы не можете иметь нижний регистр-c class es, который хранится как переменные или как данные в массивах.

EDIT: Учитывая вашу заявленную цель сравнения эффективности алгоритмов сортировки, тогда накладные расходы отразились бы на этих результатах неприятно. Вам лучше найти другой способ написать это, а не то, что вы пытаетесь сделать с массивом классов, что не будет работать.

, если вы находитесь в Java 8, то я бы, наверное, написать что-то вроде

List<Consumer<int[]>> sorters = Arrays.asList(
    Sort1::sort, Sort2::sort, Sort3::sort); 
for (Consumer<int[]> sorter : sort) { 
    int[] array = createNewRandomArray(); 
    sorter.accept(array); 
} 

Если это не так, то я бы написать что-то вроде

enum SortingVariant { 
    SORT1 { 
     @Override void sort(int[] array) { Sort1.sort(array); } 
    }, 
    SORT2 { 
     @Override void sort(int[] array) { Sort2.sort(array); } 
    }; 
    abstract void sort(int[] array); 
    } 

    for (SortingVariant sorter : SortingVariant.values()) { 
    sorter.sort(getNewRandomArray()); 
    } 

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