Я хочу сослаться на метод enum для получения класса алгоритма, чтобы я мог лениво загрузить новый экземпляр алгоритма для использования в шаблоне разработки стратегии.
В этом примере яиспользование перечисления для ссылки на три различных класса стратегии, которые вычисляют числа Фибоначчи: RecursiveFibonacciGenerator
, IterativeFibonacciGenerator
и MemoizedFibonacciGenerator
(все они наследуются от FibonacciGenerator
).
Код (со строками, генерирующими ошибкикомментарий с намерением) выглядит следующим образом:
package com.example.strategy;
public class Fibonacci {
private enum Algorithm {
RECURSIVE (RecursiveFibonacciGenerator.class),
ITERATIVE (IterativeFibonacciGenerator.class),
MEMOIZED (MemoizedFibonacciGenerator.class);
private final Class<T> algorithmClass; // Declare class of same type as constructor
private final T instance; // Declare instance of class defined in constructor
private <T extends FibonacciGenerator> Algorithm(Class<T> algorithmClass) {
this.algorithmClass = algorithmClass;
}
public T getInstance() {
if (this.instance == null) {
this.instance = this.algorithmClass.newInstance();
}
return this.instance;
}
}
public Integer getTerm(Integer termNumber) {
profileGenerator(termNumber, Algorithm.RECURSIVE);
profileGenerator(termNumber, Algorithm.ITERATIVE);
return profileGenerator(termNumber, Algorithm.MEMOIZED);
}
private Integer profileGenerator(Integer termNumber, Algorithm algorithm) {
System.out.print("Computing term using " + algorithm.toString() + " algorithm... ");
Long startTimeMilliseconds = System.currentTimeMillis();
Integer term = algorithm.getInstance().generateTerm(termNumber);
Long endTimeMilliseconds = System.currentTimeMillis();
Long computationTimeMilliseconds = endTimeMilliseconds - startTimeMilliseconds;
System.out.println("term computed in " + computationTimeMilliseconds + " milliseconds");
}
}
Я хотел бы знать, как я могу использовать этот конструктор enum
для хранения переменной-члена типа Class<T>
.
Редактировать: Добавлен полный код для уточнения намерений