我对java中的枚举类不太熟悉。并且想知道这是否适合做以下事情..(或者如果有更好的方法可以做到这一点)
基本上我要做的是我有一个Employees列表,我想将它与父类的特定子类联系起来。
public enum Employees {
BOB (new Level2Salary(salaryPlan), new SystemsDept())
MARY (new Level3Salary(salaryPlan), new SoftwareDept()),
SUSAN (new Level2Salary(salaryPlan), new SystemsDept()),
PETER (new BaseSalary(salaryPlan), new TestDept());
private Salary salary;
private Dept dept;
Employees(Salary salary, Dept dept){
this.salary = salary;
this.dept = dept;
}
public Salary getSalary() {
return salary;
}
public Salary getDept() {
return dept;
}
}
public class Level2Salary extends Salary {
private SalaryPlan salaryPlan;
public Level2Salary(SalaryPlan salaryPlan) {
this.salaryPLan = salaryPlan;
}
}
public class SystemsDept extends Dept {
public SystemsDept(){}
}
}
我希望能够这样做,所以当我调用Employees.BOB.getSalary()
时,它将返回与此枚举值相关联的相应实例化子类。 (即Level2Salary
子类)
如果除了使用枚举之外,如果有人对此有更好的建议,请随时提出建议。感谢
答案 0 :(得分:1)
使用枚举无法做到这一点。但是,您可以创建一个非枚举类,其行为与枚举类似:创建一个只有私有构造函数的类,但它具有公共静态最终字段,其类型是类本身。在Java 5之前引入的许多类都是这样的例子,例如:
较新的StandardSocketOptions不仅遵循上述模式,而且还使用泛型来完全按照您的意愿执行:它允许NetworkChannel.getOption方法为每个常量返回不同的子类型。
在您的情况下,您将使用类似StandardSocketOptions的类替换您的枚举类型:
public class Employees<S extends Salary, D extends Dept> {
public static final Employees<Level2Salary, SystemsDept> BOB =
new Employees<>(new Level2Salary(salaryPlan), new SystemsDept());
public static final Employees<Level3Salary, SoftwareDept> MARY =
new Employees<>(new Level3Salary(salaryPlan), new SoftwareDept());
public static final Employees<Level2Salary, SystemsDept> SUSAN =
new Employees<>(new Level2Salary(salaryPlan), new SystemsDept());
public static final Employees<BaseSalary, TestDept> PETER =
new Employees<>(new BaseSalary(salaryPlan), new TestDept());
private final S salary;
private final D dept;
private Employees(S salary, D dept){
this.salary = salary;
this.dept = dept;
}
public S getSalary() {
return salary;
}
public D getDept() {
return dept;
}
}