设置枚举的默认值 (Java)

Set default value of an enum (Java)

我正在编写一些显示公司员工信息的继承代码。工人可以有三种状态,它们被放在一个枚举中。 {临时,PART_TIME,FULL_TIME}。默认状态是临时的。当我 运行 时,我在代码中遇到的问题是,当我没有提及工作人员的状态时,它应该打印出“TEMPORARY”,但它却打印出“null”,我不确定关于如何修复它。我对这个问题的假设是,我认为枚举类似于数组,我应该给它某种值,然后再更改它。

这是我的代码:

class Faculty extends Employee{

        private Status status;

    public Faculty(){
            status = Status.TEMPORARY;
    }

    public Faculty(String name, String email, String phoneNumber){
        super(name, email, phoneNumber);
    }

    public Faculty(String name, String email, String phoneNumber, String office, double salary, Status status){
        super(name, email, phoneNumber, office, salary);
        this.status = status;
    }

    public void setStatus(Status status){
        this.status = status;
    }

    public String getStatus(){
        return " Status: " + status;
    }

    @Override
   public String toString(){
      return getName() + getEmail() + getPhoneNumber() + getOffice() + " Salary: " + getSalary() + getStatus();
   }
}

您似乎正在使用第二个构造函数来创建 Faculty。但是,此构造函数从未将 status 字段设置为任何值,而是将其保留为空。

要确保 status 有值,您必须在构造函数中添加一行:

public Faculty(String name, String email, String phoneNumber){
  super(name, email, phoneNumber);
  this.status = Status.TEMPORARY;
}

或者您可以将初始化添加到字段声明中:private Status status = Status.TEMPORARY;

关于代码的一些其他评论:

  • 仍然可以在第三个构造函数中或通过 setter 将 status 设置为 null。在这种情况下,您可能想抛出一个 exception/use 默认值。
  • Setter 和 Getters 应该具有相同的数据类型。 getStatus 应该 return 状态,而不是它的格式化字符串版本。

如果在Facultyclass中定义时直接给status字段赋值,那么默认情况下就是给该字段的值。

private Status status = Status.TEMPORARY;

这意味着您不再需要在不更改字段默认值 TEMPORARY 的构造函数中手动设置它。

public Faculty(){
   // status = Status.TEMPORARY; This line can be removed.
}

还需要注意的是,当您从 Faculty class:

中的此构造函数调用 super 构造函数时
public Faculty(String name, String email, String phoneNumber){
    super(name, email, phoneNumber);
}

您编写的默认 Faculty 构造函数(将 status 设置为 TEMPORARY 的构造函数)未被调用,所以这可能就是 status 字段仍然存在的原因null 即使你在默认构造函数中给它一个默认值。直接在字段中设置默认值可以解决这个问题,但记住这一点仍然有用!