You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写构造方法限制Java子类shifts变量仅接受指定三个字符串值

PartTimeStaffHire子类shifts变量取值限制的修正方案

我是编程新手,正在编写继承自StaffHire的PartTimeStaffHire子类,希望该类的shifts变量仅能接受morning、evening、night这三个字符串值。以下是我尝试编写的代码,请求帮助实现正确逻辑:

这是一个子类,我尝试让shifts变量仅接受三个值中的一个,即morning、evening、night,我是新手,恳请谅解这个简单问题

public class PartTimeStaffHire extends StaffHire
{
    // instance variables - replace the example below with your own
    private int workingHour
private double wagesPerHour
private String shifts;
    private boolean terminated
}

这是StaffHire的子类,包含上述所有变量,最后一个变量我希望仅能接受三个值中的一个

/**
     * Constructor for objects of class PartTimeStaffHire
     */
    public PartTimeStaffHire(int vacancy, String designation1, String typeofjob,
    String staffName1, String joinDate, String qualification1, String appointed, 
    boolean joined, int hoursPerDay, double wagePerHour, String shift)
    {
        super(vacancy, designation1, typeofjob, staffName1, joinDate,
        qualification1, appointed, joined);
        workingHour = hoursPerDay;
        wagesPerHour = wagePerHour;
        shifts = shift;
        if( shifts == "morning") {
        
        shifts =  "morning";
        }
        else if(shifts == "evening") {
        shifts =  "evening";
        }
        else if(shifts == "night") {
        shifts =  "night";
        
        }
        else { 
            System.out.println("Choose (morning, evening, night)");
        }
        //(morning, evening, night)
        
    }
public String shift()
    {
        if( shifts == "morning") {
        
        shifts =  "morning";
        }
        else if(shifts == "evening") {
        shifts =  "evening";
        }
        else if(shifts == "night") {
        shifts =  "night";
        
        }
        else { 
            System.out.println("Choose (morning, evening, night)");
        }
        return shifts;
    }
    
    /**
     * An example of a method - replace this comment with your own
     *
     * @param  y  a sample parameter for a method
     * @return    the sum of x and y
     */
    public void print()
    {
       super.print();
       System.out.println("The yearly salary is " + wagesPerHour);
       System.out.println("Weekly working hours are " + workingHour;
System.out.println("##################" + shifts);
    }
}

代码中的问题及修正方法

  • 字符串比较错误:Java中字符串内容比较不能用==(==比较对象引用地址),必须用equals()方法,比如shifts.equals("morning")。
  • 语法错误:变量声明末尾缺少分号(workingHour、wagesPerHour、terminated);print()方法中System.out.println("Weekly working hours are " + workingHour;缺少闭合括号。
  • 逻辑冗余:构造器和shift()方法的校验逻辑重复,应统一放到setter方法中,构造器调用setter完成赋值校验。
  • 取值限制不够严谨:直接用字符串校验容易出现大小写错误,推荐用枚举(Enum)限定可选值,编译期就能拦截非法输入。

修正后的完整代码

方案一:使用枚举限定取值(推荐)

先定义Shift枚举:

public enum Shift {
    MORNING, EVENING, NIGHT
}

修改PartTimeStaffHire类:

public class PartTimeStaffHire extends StaffHire {
    private int workingHour;
    private double wagesPerHour;
    private Shift shifts;
    private boolean terminated;

    public PartTimeStaffHire(int vacancy, String designation1, String typeofjob,
                             String staffName1, String joinDate, String qualification1, String appointed,
                             boolean joined, int hoursPerDay, double wagePerHour, Shift shift) {
        super(vacancy, designation1, typeofjob, staffName1, joinDate, qualification1, appointed, joined);
        this.workingHour = hoursPerDay;
        this.wagesPerHour = wagePerHour;
        this.shifts = shift;
    }

    public Shift getShifts() {
        return shifts;
    }

    public void setShifts(Shift shifts) {
        this.shifts = shifts;
    }

    public void print() {
        super.print();
        System.out.println("时薪: " + wagesPerHour);
        System.out.println("每日工作时长: " + workingHour);
        System.out.println("班次: " + shifts.name().toLowerCase());
    }
}

方案二:基于字符串的校验(兼容原有逻辑)

public class PartTimeStaffHire extends StaffHire {
    private int workingHour;
    private double wagesPerHour;
    private String shifts;
    private boolean terminated;

    public PartTimeStaffHire(int vacancy, String designation1, String typeofjob,
                             String staffName1, String joinDate, String qualification1, String appointed,
                             boolean joined, int hoursPerDay, double wagePerHour, String shift) {
        super(vacancy, designation1, typeofjob, staffName1, joinDate, qualification1, appointed, joined);
        this.workingHour = hoursPerDay;
        this.wagesPerHour = wagePerHour;
        setShifts(shift); // 调用setter做校验
    }

    // 统一校验逻辑的setter
    public void setShifts(String shift) {
        if ("morning".equals(shift) || "evening".equals(shift) || "night".equals(shift)) {
            this.shifts = shift;
        } else {
            System.out.println("无效班次,请选择morning、evening或night");
            this.shifts = null; // 也可设置默认值,比如"morning"
        }
    }

    public String getShifts() {
        return shifts;
    }

    public void print() {
        super.print();
        System.out.println("时薪: " + wagesPerHour);
        System.out.println("每日工作时长: " + workingHour);
        System.out.println("班次: " + shifts);
    }
}

内容的提问来源于stack exchange,提问作者kr3m213

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 21:50:31