Java中的封装和实体类(javabean)

1. 封装的概念与设计规范


1.1 什么是封装?
  • 定义
    封装是面向对象编程的三大特征(封装、继承、多态)之一,指将数据(属性)和操作数据的方法(行为)捆绑在一个对象中,并控制对内部数据的访问权限。
  • 核心目标
    • 隐藏对象的内部实现细节
    • 通过公开的接口安全地访问和修改数据

1.2 封装的设计规范

原则合理隐藏,合理暴露!!!

  1. 隐藏:通过 private 修饰符限制对成员变量的直接访问。
  2. 暴露:通过 public 修饰的 gettersetter 方法提供安全的数据操作接口。

代码示例

public class Student {
    // 隐藏成员变量(私有化)
    private String name;
    private int age;
    private double chinese;
    private double math;

    // 暴露方法(公共接口)
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        // 数据校验:保证赋值合法性
        if (age > 0 && age < 200) {
            this.age = age;
        } else {
            System.out.println("年龄数据非法!");
        }
    }

    public int getAge() {
        return age;
    }

    // 其他业务方法
    public void printTotalScore() {
        System.out.println(name + "的总分是:" + (chinese + math));
    }
}

1.3 如何控制成员的公开或隐藏?
修饰符作用适用范围
private隐藏成员,仅本类内可直接访问成员变量、方法、构造器
public公开成员,所有地方均可访问成员变量、方法、构造器

示例

private int age;          // 隐藏变量,外部无法直接访问
public int getAge() {    // 公开方法,允许外部安全获取值
    return age;
}

1.4 封装的优势
  1. 数据安全性

    • 通过 setter 方法进行数据校验,避免非法赋值。
    public void setAge(int age) {
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("年龄不合法!");
        }
        this.age = age;
    }
    
  2. 代码可维护性

    • 内部实现细节修改不影响外部调用(如字段名变更、计算逻辑调整)。
  3. 接口统一性

    • 提供标准化的数据访问方式,便于扩展和协作。

1.5 实际开发规范
  1. 成员变量私有化

    • 所有成员变量默认使用 private 修饰,禁止直接通过对象访问。
  2. 提供公共访问方法

    • 通过 getXxx() 获取值,通过 setXxx() 修改值。
    • 根据业务需求选择性暴露方法(例如只读属性不提供 setter)。
  3. 方法按需公开

    • 仅对外部需要调用的方法使用 public 修饰,内部辅助方法使用 private

2. 实体类的定义与应用


2.1 什么是实体类?

定义
实体类是一种特殊的 Java 类,其核心职责是存储数据。它通过私有化成员变量并提供公共的访问方法,将数据与业务逻辑分离。

特点

  1. 成员变量私有化
    所有成员变量必须使用 private 修饰,禁止直接访问。
  2. 公共的 getter/setter 方法
    通过 public 方法控制对成员变量的读写。
  3. 无参构造器
    必须显式定义无参构造器(默认构造器可能因有参构造器的定义而失效)。
  4. 数据与业务分离
    实体类仅负责存储数据,业务处理由其他类完成

示例

public class Student {
    // 私有成员变量
    private String name;
    private double score;

    // 无参构造器(必须显式定义)
    public Student() {}

    // 有参构造器(可选)
    public Student(String name, double score) {
        this.name = name;
        this.score = score;
    }

    // getter/setter 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}

2.2 实体类的应用场景

核心场景

  • 数据存储与业务处理分离
    实体类对象仅保存数据,业务逻辑由其他类(如服务类、操作类)实现。

示例

public class StudentOperator {
    private Student student;

    public StudentOperator(Student student) {
        this.student = student;
    }

    // 业务方法:打印学生总分
    public void printTotalScore() {
        System.out.println("总分:" + student.getScore());
    }

    // 业务方法:判断是否及格
    public void checkPass() {
        if (student.getScore() >= 60) {
            System.out.println(student.getName() + "及格!");
        } else {
            System.out.println(student.getName() + "不及格!");
        }
    }
}

// 使用示例
Student stu = new Student("张三", 85.5);
StudentOperator operator = new StudentOperator(stu);
operator.printTotalScore(); // 输出:总分:85.5
operator.checkPass();       // 输出:张三及格!

2.3 实体类的设计规范
  1. 成员变量私有化
    • 所有字段使用 private 修饰,禁止直接通过对象访问。
  2. 提供公共访问方法
    • 为每个字段提供 publicgetXxx()setXxx() 方法。
  3. 显式定义无参构造器
    • 即使存在有参构造器,也必须手动添加无参构造器。

2.4 注意事项
  1. 框架依赖
    • 许多框架(如 Hibernate、Spring Data JPA)要求实体类必须有无参构造器。
  2. Lombok 简化代码
    • 使用 @Data 注解(Lombok 库)可自动生成 getter/setter 和无参构造器。
    import lombok.Data;
    
    @Data
    public class Student {
        private String name;
        private double score;
    }
    
  3. 数据校验
    • 可在 setter 方法中加入数据校验逻辑,确保数据合法性。
    public void setScore(double score) {
        if (score < 0 || score > 100) {
            throw new IllegalArgumentException("分数必须在 0-100 之间!");
        }
        this.score = score;
    }
    

2.5 总结
  • 核心作用:实体类是数据存储的标准化容器,与业务逻辑解耦。
  • 设计原则
    • 私有化字段,通过公共方法控制访问。
    • 显式定义无参构造器,避免框架兼容性问题。
  • 应用价值
    • 提升代码可维护性,便于协作开发和功能扩展。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值