- 案例中的 setter/getter 模式与封装性(姓名:周广磊 学号:202421336092)
2.1 什么是 setter/getter?
setter 方法(也称为修改器方法)和 getter 方法(也称为访问器方法)是面向对象编程中用于操作类私有属性的公共方法。在学生管理系统的Student类中,setter 方法用于设置私有属性的值,其命名通常以 “set” 开头,后接属性名(首字母大写),且方法参数类型与对应属性的类型一致,无返回值;getter 方法用于获取私有属性的值,命名通常以 “get” 开头,后接属性名(首字母大写),无参数,返回值类型与对应属性的类型一致。
以Student类的name属性为例,对应的 setter 方法为public void setName(String name),getter 方法为public String getName()。外部类若要修改学生姓名,需调用setName方法并传入合法的姓名参数;若要获取学生姓名,则调用getName方法即可得到姓名字符串。
2.2 setter/getter 有什么用?
配合封装实现属性操作:类的私有属性无法被外部直接访问,setter/getter 作为公共接口,为外部提供了安全的属性访问通道。没有 setter/getter,封装性将无法落地 —— 要么为了方便访问将属性设为public,破坏封装;要么完全禁止外部访问属性,导致类的功能无法正常使用。因此,setter/getter 是封装性的 “桥梁”,既保证了属性的隐藏,又满足了外部对属性的合理操作需求。
实现数据过滤与校验:在 setter 方法中可添加业务逻辑校验,确保属性值符合实际需求。例如,在Student类的setMajor(String major)方法中,可添加判断 “若 major 为 null 或空字符串,则默认设置为‘未分配专业’”,避免学生专业信息为空的情况;在setStudentId(String studentId)方法中,可校验学号格式(如 “是否为 10 位数字”),若不符合格式则抛出异常,保证学号信息的规范性。
支持属性的只读或只写控制:根据业务需求,可灵活控制是否提供 setter 或 getter 方法。例如,学生的学号在创建后不允许修改,此时可只提供getStudentId()方法,不提供setStudentId()方法,实现学号的 “只读” 特性;若某个属性(如 “临时备注”)只需允许外部修改,无需外部读取,则可只提供 setter 方法,不提供 getter 方法,实现属性的 “只写” 特性。
2.3 怎么自动生成 setter/getter?
在主流的 Java 开发工具(如 IntelliJ IDEA、Eclipse)中,均可通过工具自带功能自动生成 setter/getter 方法,无需手动编写,具体步骤如下(以 IntelliJ IDEA 为例):
新建Student类,并在类中定义私有属性(如private String studentId; private String name;);
将光标定位到类内部的空白处,右键点击,在弹出的菜单中选择 “Generate”(或使用快捷键Alt + Insert);
在 “Generate” 下拉菜单中,选择 “Getter and Setter” 选项;
在弹出的 “Select Fields to Generate Getters and Setters” 窗口中,勾选需要生成 setter/getter 方法的属性(可通过 “Select All” 按钮勾选所有属性),然后点击 “OK”;
工具将自动在类中生成所选属性对应的 setter 和 getter 方法,例如:
public String getStudentId() {
return studentId;
}
public void setStudentId(String studentId) {
this.studentId = studentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
通过工具自动生成 setter/getter 方法,不仅能避免手动编写时可能出现的语法错误(如方法名拼写错误、参数类型不匹配等),还能极大提高开发效率,尤其在类的属性较多时,优势更为明显。
3. 案例中某些类的 toString () 方法(姓名:周广磊 学号:202421336092)
3.1 toString 方法有什么用?
toString()方法是用于返回对象的字符串表示形式的方法。在默认情况下,若未重写toString()方法,当我们打印一个对象(如System.out.println(student))时,输出的结果是 “类的全限定名 @对象的哈希码十六进制表示”(例如com.studentmanagement.Student@1b6d3586),这种输出形式对开发者而言几乎没有实际意义,无法直观了解对象的具体属性值。
而重写toString()方法后,可自定义对象的字符串输出格式,使其包含对象的核心属性信息。例如,在Student类中重写toString()方法后,打印student对象时,输出结果可能为 “Student {studentId='2023001', name=' 张三 ', age=20, major=' 计算机科学与技术 '}”,开发者可直接通过输出结果获取学生的关键信息,便于代码调试、日志记录以及对象信息的展示。
3.2 toString 一般应包含什么内容?
toString()方法的返回内容应遵循 “简洁、清晰、包含核心信息” 的原则,通常包含对象的关键属性值,避免包含无关或冗余信息。以学生管理系统中的类为例:
Student 类:应包含学生的唯一标识(学号studentId)、基本信息(姓名name、年龄age)以及核心业务信息(专业major),例如返回格式为 “Student {studentId='xxx', name='xxx', age=xx, major='xxx'}”;
Teacher 类:若系统中包含Teacher类,其toString()方法可包含教师编号teacherId、姓名name、所属部门department、教授课程course等信息,返回格式为 “Teacher {teacherId='xxx', name='xxx', department='xxx', course='xxx'}”;
Course 类:若包含Course类,可包含课程编号courseId、课程名称courseName、学分credit、授课教师teacher(可调用teacher对象的toString()方法或仅获取教师姓名)等信息,返回格式为 “Course {courseId='xxx', courseName='xxx', credit=xx, teacher='xxx'}”。
需要注意的是,toString()方法的返回内容应避免包含敏感信息(如学生的身份证号、联系电话等),同时确保属性值的格式统一,便于阅读和后续处理。
3.3 toString () 方法从哪里来?
toString()方法来源于 Java 中的根类 ——java.lang.Object类。在 Java 中,所有的类(无论是自定义类还是系统提供的类)都默认直接或间接继承自Object类,因此Object类中的方法(包括toString()、equals()、hashCode()等)会被所有类继承。
Object类中toString()方法的默认实现代码如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
该实现返回的字符串由 “类的全限定名”“@符号” 和 “对象哈希码的十六进制表示” 三部分组成,如前文所述,这种默认输出对开发者意义不大。因此,在实际开发中,我们通常会在自定义类(如Student、Teacher、Course等)中重写toString()方法,以实现自定义的对象字符串表示形式。
与 setter/getter 方法类似,toString()方法也可通过开发工具自动生成(以 IntelliJ IDEA 为例):在类内部右键点击,选择 “Generate”→“toString ()”,然后勾选需要包含在toString()方法中的属性,工具将自动生成重写后的toString()方法代码,避免手动编写时的错误和繁琐操作。