杰瑞科技汇

Java中set/get方法的作用是什么?

什么是 setget 方法?

setget 方法是Java编程中一种非常普遍和重要的编码规范,它们共同构成了访问器方法

Java中set/get方法的作用是什么?-图1
(图片来源网络,侵删)
  • Getter (Get方法): 用于获取(读取)一个对象的私有字段的值。
  • Setter (Set方法): 用于设置(修改)一个对象的私有字段的值。

我们会将类的成员变量(字段)声明为 private(私有的),以实现封装这一面向对象的核心原则,我们通过 public(公有的)的 getset 方法来间接地访问和修改这些私有变量。


为什么需要 setget 方法?(封装的好处)

直接将字段暴露为 public 是非常危险的,因为它破坏了封装性,使用 private 字段配合 publicset/get 方法有以下核心优势:

  1. 数据隐藏: 类的内部实现细节被隐藏起来,外部代码无法直接访问和修改数据,只能通过提供的方法进行操作。
  2. 数据验证: 在 set 方法中,你可以添加逻辑来确保数据的有效性,年龄不能为负数,用户名不能为空等。
  3. 控制访问: 你可以决定哪些字段可以被修改,哪些字段是只读的(只提供 get 方法,不提供 set 方法)。
  4. 灵活性: 未来如果需要修改字段的存储方式或计算逻辑,你只需要修改 setget 方法的内部实现,而不需要修改所有调用这些方法的代码,你可能想把 String 类型的 name 改成两个字段 firstNamelastName,但对外提供的 getName() 方法仍然返回一个完整的名字。
  5. 附加功能: 在 set 方法中,除了设置值,你还可以触发其他操作,比如更新UI界面、记录日志、或者在值改变时通知其他对象等。

setget 方法的命名和语法规范

Java社区(特别是通过JavaBeans规范)对 setget 方法有非常明确的约定:

Getter 方法

  • 方法名以 get 开头。
  • 后面紧跟首字母大写的字段名。
  • 返回类型与字段的类型相同。
  • 对于布尔类型的字段,可以使用 is 作为前缀,isActive() 而不是 getActive(),但这两种方式都存在,get 更通用。

Setter 方法

  • 方法名以 set 开头。
  • 后面紧跟首字母大写的字段名。
  • 返回类型void
  • 接收一个参数,参数类型与字段的类型相同,参数名就是字段名(通常带 a 前缀或直接用小写)。

代码示例

让我们通过一个 Student 类来具体说明。

Java中set/get方法的作用是什么?-图2
(图片来源网络,侵删)

示例1:基础的 setget

public class Student {
    // 1. 将字段设为 private,实现数据隐藏
    private String name;
    private int age;
    private boolean isActive;
    // 2. 提供 public 的 Getter 和 Setter 方法
    // Getter for name
    public String getName() {
        return this.name;
    }
    // Setter for name
    public void setName(String name) {
        this.name = name;
    }
    // Getter for age
    public int getAge() {
        return this.age;
    }
    // Setter for age (可以加入数据验证)
    public void setAge(int age) {
        // 验证年龄是否在合理范围内
        if (age > 0 && age < 120) {
            this.age = age;
        } else {
            System.out.println("Invalid age provided. Age not set.");
        }
    }
    // Getter for isActive (使用 is 前缀)
    public boolean isActive() {
        return this.isActive;
    }
    // Setter for isActive
    public void setActive(boolean active) {
        this.isActive = active;
    }
}

如何使用这个类?

public class Main {
    public static void main(String[] args) {
        // 创建一个 Student 对象
        Student student1 = new Student();
        // 使用 Setter 方法设置值
        student1.setName("Alice");
        student1.setAge(20);
        student1.setActive(true);
        // 使用 Getter 方法获取值
        System.out.println("Student Name: " + student1.getName()); // 输出: Student Name: Alice
        System.out.println("Student Age: " + student1.getAge());   // 输出: Student Age: 20
        System.out.println("Is Active: " + student1.isActive());   // 输出: Is Active: true
        // 尝试设置一个无效的年龄
        student1.setAge(-5); // 输出: Invalid age provided. Age not set.
        System.out.println("Student Age after invalid attempt: " + student1.getAge()); // 输出: Student Age after invalid attempt: 20
    }
}

现代Java中的 setget:Lombok

手动为每个字段编写 gettersetter 是非常重复和繁琐的工作,为了解决这个问题,一个非常流行的库 Lombok 应运而生。

Lombok 通过注解,在编译时自动为你的类生成 gettersettertoString()equals()hashCode() 等样板代码。

使用 Lombok 的 Student

import lombok.Getter;
import lombok.Setter;
@Getter // 为所有 private 字段生成 Getter
@Setter // 为所有 private 字段生成 Setter
public class StudentLombok {
    private String name;
    private int age;
    private boolean isActive;
    // 你仍然可以自定义一些方法,比如带验证的 setAge
    public void setAge(int age) {
        if (age > 0 && age < 120) {
            this.age = age;
        } else {
            System.out.println("Invalid age provided. Age not set.");
        }
    }
}

注意: 当你使用 @Getter@Setter 时,Lombok 会生成所有字段的访问器,但如果你像上面的例子一样,手动编写了一个 setAge 方法,Lombok 会尊重你的手动实现,只为 nameisActive 生成 setter,而 agesetter 则使用你自定义的那个带验证的逻辑。

使用 Lombok 的 Main

public class Main {
    public static void main(String[] args) {
        StudentLombok student = new StudentLombok();
        // 使用 Lombok 生成的 Setter
        student.setName("Bob");
        student.setAge(25);
        // 使用 Lombok 生成的 Getter
        System.out.println("Student Name: " + student.getName()); // 输出: Student Name: Bob
        System.out.println("Student Age: " + student.getAge());   // 输出: Student Age: 25
        student.setAge(-1); // 输出: Invalid age provided. Age not set.
    }
}

如何使用Lombok:

Java中set/get方法的作用是什么?-图3
(图片来源网络,侵删)
  1. 在你的 pom.xml (Maven) 或 build.gradle (Gradle) 文件中添加 Lombok 依赖。
  2. 在你的 IDE (如 IntelliJ IDEA 或 Eclipse) 中安装 Lombok 插件。
  3. 在类上使用 @Getter, @Setter, @Data (同时包含get, set, toString等) 等注解。

特性 手动编写 set/get 使用 Lombok
优点 - 代码清晰,易于理解底层原理
- 可以对每个方法进行完全自定义(如复杂验证)
- 大幅减少样板代码
- 提高开发效率
- 代码更简洁
缺点 - 代码冗长,重复性高
- 维护成本高(修改字段名需同步修改方法)
- 引入外部依赖
- 需要配置IDE和构建工具
- 初学者可能不理解其背后的原理
适用场景 - 学习阶段,理解封装
- 项目不允许使用第三方库
- 需要对访问方法进行非常精细和复杂的控制
- 绝大多数现代Java项目
- 快速开发和迭代
- 团队成员都熟悉Lombok

核心要点setget 方法是实现封装的关键手段,它们保护了对象的内部状态,提供了数据验证和灵活性的可能,虽然手动编写很繁琐,但理解其原理至关重要,在实际开发中,Lombok 等工具极大地简化了这一过程。

分享:
扫描分享到社交APP
上一篇
下一篇