如何在枚举中定义通用成员变量?

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>类型的成员变量.

编辑:添加完整代码以澄清意图

Jef*_*ter 6

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)

这样做你想要的吗?

另一种选择是使用该类的实例,但经过进一步思考后,我认为这是一个坏主意.如果您打算使用该类的实例,那么为什么您首先需要枚举?

  • plouh是对的,这个类的真实例子比反射创建它更好. (2认同)