gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:16:29 24 4
gpt4 key购买 nike

我想引用枚举方法来检索算法的类,以便我可以延迟加载算法的新实例以用于策略设计模式。

在此示例中,我使用枚举来引用计算斐波那契数的三个不同策略类: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> 的成员变量的构造函数类型。

编辑:添加完整代码以阐明意图

最佳答案

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;
}
}

这是你想要的吗?

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

关于java - 如何在枚举中定义通用成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6204615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com