具有多个对象值的枚举类

时间:2016-05-31 13:37:25

标签: java enums

我对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子类)

如果除了使用枚举之外,如果有人对此有更好的建议,请随时提出建议。感谢

1 个答案:

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