And*_*rew 3 java generics enums
我想引用一个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");
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何使用此enum
构造函数来存储该Class<T>
类型的成员变量.
编辑:添加完整代码以澄清意图
public enum Algorithm {
RECURSIVE(FibonacciGenerator.RecursiveFibonacciGenerator.class),
ITERATIVE(FibonacciGenerator.IterativeFibonacciGenerator.class),
MEMOIZED(FibonacciGenerator.MemoizedFibonacciGenerator.class);
private final Class<? extends FibonacciGenerator> algorithmClass;
private <T extends FibonacciGenerator> Algorithm(Class<T> algorithmClass) {
this.algorithmClass = algorithmClass;
}
}
Run Code Online (Sandbox Code Playgroud)
这样做你想要的吗?
另一种选择是使用该类的实例,但经过进一步思考后,我认为这是一个坏主意.如果您打算使用该类的实例,那么为什么您首先需要枚举?
归档时间: |
|
查看次数: |
3505 次 |
最近记录: |