杰瑞科技汇

Java为何要用set/get方法?

setget 方法是 Java 编程中一种极其普遍和重要的编码规范,它们共同构成了封装这一面向对象编程核心概念的实现方式。

Java为何要用set/get方法?-图1
(图片来源网络,侵删)

核心概念:封装

在深入 setget 之前,必须先理解封装

封装 的思想是:将对象的属性(数据)和操作这些属性的方法捆绑在一起,并对外部世界隐藏对象的内部细节。

你可以把一个对象想象成一个带锁的黑盒子,使用者不需要知道盒子内部是如何工作的,只需要通过盒子提供的特定接口(比如钥匙孔,也就是 setget 方法)来与盒子交互即可。

这样做的好处是:

Java为何要用set/get方法?-图2
(图片来源网络,侵删)
  1. 数据安全:防止外部代码随意修改对象内部的状态。
  2. 代码维护性:我们可以随时修改内部实现,而不会影响到外部调用该对象的代码。
  3. 灵活性:可以在 set 方法中加入逻辑,使属性的设置不仅仅是简单的赋值。

get 方法 的作用

get 方法,也称为访问器getter,它的作用是获取对象的私有属性值。

主要作用:

  1. 提供受控的访问:将类的内部属性(字段)声明为 private,外部代码无法直接访问。get 方法就像一个“只读”的窗口,允许外部代码在需要时获取该属性的值。

  2. 隐藏实现细节:调用 get 方法时,你只需要知道方法名(如 getName()),而不需要关心 name 这个变量在底层是如何存储的,也许 name 是从数据库里查出来的,或者经过复杂的计算,但这些都对调用者透明。

    Java为何要用set/get方法?-图3
    (图片来源网络,侵删)

示例:

public class Person {
    // 1. 将属性声明为 private,实现隐藏
    private String name;
    private int age;
    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 2. 提供 get 方法来获取私有属性
    public String getName() {
        return this.name;
    }
    public int getAge() {
        return this.age;
    }
}
// 在另一个类中使用
public class Main {
    public static void main(String[] args) {
        Person person = new Person("张三", 30);
        // 错误!无法直接访问私有属性
        // String name = person.name; // 编译错误
        // 正确!通过 get 方法获取值
        String name = person.getName();
        int age = person.getAge();
        System.out.println("姓名: " + name); // 输出: 姓名: 张三
        System.out.println("年龄: " + age);  // 输出: 年龄: 30
    }
}

set 方法 的作用

set 方法,也称为修改器setter,它的作用是设置修改对象的私有属性值。

主要作用:

  1. 提供受控的修改:外部代码不能直接给私有属性赋值,必须通过 set 方法,这给了我们在赋值前进行校验和逻辑处理的机会。

  2. 数据校验:这是 set 方法最重要的功能之一,我们可以在 set 方法中添加判断逻辑,确保赋给属性的值是合法的、有效的。

  3. 业务逻辑触发:当某个属性被修改时,可能需要触发一些其他的操作,修改了用户名,可能需要同时更新数据库、发送通知等,这些逻辑都可以放在 set 方法中。

示例:

public class Student {
    private String name;
    private int score; // 分数
    // ... 构造方法和 get 方法 ...
    // 3. 提供 set 方法来修改私有属性,并加入校验逻辑
    public void setName(String name) {
        // 检查名字是否为空或空字符串
        if (name == null || name.trim().isEmpty()) {
            System.out.println("错误:姓名不能为空!");
            // 可以选择抛出异常或直接不赋值
            return;
        }
        this.name = name; // 只有校验通过才赋值
    }
    public void setScore(int score) {
        // 检查分数是否在有效范围内
        if (score < 0 || score > 100) {
            System.out.println("错误:分数必须在 0 到 100 之间!");
            return;
        }
        this.score = score;
        // 可以在这里添加其他逻辑,比如更新平均分等
    }
}
// 在另一个类中使用
public class Main {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("李四");
        student.setScore(95);
        System.out.println("学生姓名: " + student.getName()); // 输出: 学生姓名: 李四
        System.out.println("学生分数: " + student.getScore()); // 输出: 学生分数: 95
        // 尝试设置非法值
        student.setName(""); // 输出: 错误:姓名不能为空!
        student.setScore(150); // 输出: 错误:分数必须在 0 到 100 之间!
        // 非法值没有被设置,所以属性保持原样
        System.out.println("学生姓名: " + student.getName()); // 输出: 学生姓名: 李四
        System.out.println("学生分数: " + student.getScore()); // 输出: 学生分数: 95
    }
}

命名规范

Java 社区有一套非常严格的命名规范来统一 setget 方法的风格:

  • get 方法
    • 方法名以 get 开头。
    • 后面紧跟属性名的首字母大写形式。
    • 如果属性是 boolean 类型,通常用 is 代替 getisActive() 而不是 getActive())。
  • set 方法
    • 方法名以 set 开头。
    • 后面紧跟属性名的首字母大写形式。
    • 方法参数类型与属性类型一致,参数名就是属性名(通常小写)。

示例:

属性类型 属性名 get 方法名 set 方法名
String userName getUserName() setUserName(String userName)
int age getAge() setAge(int age)
boolean isActive isActive() setActive(boolean isActive)
double price getPrice() setPrice(double price)

现代 Java 的演进:Lombok

虽然 setget 方法非常重要,但手动编写它们非常繁琐且重复,为了解决这个问题,Lombok 库应运而生。

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

使用 Lombok 的示例:

import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Product {
    private String id;
    private String name;
    private double price;
}
// 使用方式完全一样,但代码量大大减少
public class Main {
    public static void main(String[] args) {
        Product product = new Product();
        product.setName("笔记本电脑");
        product.setPrice(5999.99);
        System.out.println("产品名称: " + product.getName()); // 输出: 产品名称: 笔记本电脑
        System.out.println("产品价格: " + product.getPrice()); // 输出: 产品价格: 5999.99
    }
}

注意:使用 Lombok 需要在你的 IDE(如 IntelliJ IDEA, Eclipse)中安装相应的插件,并且在构建工具(如 Maven 或 Gradle)中添加 Lombok 依赖。


特性 get 方法 (Getter) set 方法 (Setter)
核心作用 读取私有属性的值 修改私有属性的值
提供访问 提供对私有属性的只读访问 提供对私有属性的可控修改
主要优点 隐藏内部实现,保证数据不被随意读取 可以进行数据校验,防止非法值
附加逻辑 可以在返回前对数据进行处理(如格式化) 可以在赋值后触发业务逻辑(如更新数据库)
命名规范 get + 属性名首字母大写 set + 属性名首字母大写

setget 方法是 Java 封装思想的基石,它们虽然看起来简单,却是构建健壮、安全、可维护的面向对象应用程序的基石,在现代开发中,虽然 Lombok 等工具可以自动生成它们,但理解其背后的原理和重要性是每个 Java 程序员必备的技能。

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