如何编写构造方法限制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
相关产品推荐
相关产品推荐

