ChatGPT:使用 public 属性,还是使用getter setter

ChatGPT:使用 public 属性,还是使用getter setter

以下回答均来自于 ChatGPT 3.5
问题:从不用自动生成getter setter,要么用public属性,要么手写get set方法做精细化的控制,不太理解pojo自动生成的get set和直接用public属性有什么区别
回答:POJO(Plain Old Java Object)是一种简单的Java对象,通常用于表示数据或领域对象,它的属性通常具有私有访问修饰符(private)以封装数据。关于使用自动生成的getter和setter方法、使用public属性以及手写自定义的getter和setter方法之间的区别如下:

  1. 自动生成的getter和setter方法:

    • 自动生成getter和setter方法是一种常见的Java编程惯例,通常使用IDE(如Eclipse、IntelliJ IDEA等)来自动生成。
    • 这些方法提供了对对象属性的访问和修改,但它们允许你在方法中添加额外的逻辑,例如验证输入值或触发其他操作。
    • 自动生成的getter和setter方法可以帮助你维护封装性,即使后期需要在属性上添加逻辑,也可以轻松扩展。
  2. 使用public属性:

    • 如果你将属性设置为public,那么这些属性将可以直接从外部访问,不需要通过getter和setter方法。
    • 这种方式不具备封装性,因为外部代码可以随意访问和修改属性的值,这可能导致难以控制和维护对象的状态。
    • 这种方式通常不被推荐,因为它违反了封装的原则,使代码更加脆弱和难以维护。
  3. 手写自定义的getter和setter方法:

    • 手写自定义的getter和setter方法可以让你有选择地控制属性的访问和修改。
    • 你可以在这些方法中添加逻辑来验证输入值、执行计算、触发事件等。
    • 这种方式允许你在需要时提供更精细化的控制,但也需要更多的手动编码工作。

总的来说,使用自动生成的getter和setter方法通常是一种很好的实践,因为它们提供了一种平衡,既可以维护封装性又可以在需要时添加额外的逻辑。如果你需要更多的控制或希望自定义属性的访问行为,那么手写自定义的getter和setter方法可能是一个更好的选择。但请注意,直接使用public属性通常是不推荐的,因为它会破坏封装性,可能引发不可预测的问题。


问题:举一个实际开发中的例子
回答:以下是一个实际开发中的例子,说明何时使用自动生成的getter和setter方法以及何时使用自定义的getter和setter方法:

假设你正在开发一个银行账户(BankAccount)类,该类具有以下属性:

  1. accountNumber(账号号码):表示银行账户的唯一标识。
  2. balance(余额):表示账户的当前余额。

示例情况1:使用自动生成的getter和setter方法

java 复制代码
public class BankAccount {
    private String accountNumber;
    private double balance;

    // 自动生成的getter和setter方法
    public String getAccountNumber() {
        return accountNumber;
    }

    public void setAccountNumber(String accountNumber) {
        this.accountNumber = accountNumber;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }
}

在这种情况下,你可以使用自动生成的getter和setter方法,因为这些属性不需要额外的逻辑控制,只需提供基本的读写操作即可。

示例情况2:使用自定义的getter和setter方法

java 复制代码
public class BankAccount {
    private String accountNumber;
    private double balance;

    public String getAccountNumber() {
        return accountNumber;
    }

    public void setAccountNumber(String accountNumber) {
        // 添加逻辑以验证账号号码的有效性
        if (isValidAccountNumber(accountNumber)) {
            this.accountNumber = accountNumber;
        } else {
            throw new IllegalArgumentException("Invalid account number");
        }
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        // 添加逻辑以确保余额不会为负数
        if (balance >= 0) {
            this.balance = balance;
        } else {
            throw new IllegalArgumentException("Balance cannot be negative");
        }
    }

    private boolean isValidAccountNumber(String accountNumber) {
        // 添加逻辑以验证账号号码的有效性
        // 例如,检查账号号码是否符合特定的格式或规则
        return true; // 简化示例,实际应该有更复杂的验证逻辑
    }
}

在这种情况下,你可以使用自定义的getter和setter方法,因为你需要添加额外的逻辑来确保账号号码有效性和余额的非负性。

总之,决定使用自动生成的getter和setter方法还是自定义的getter和setter方法取决于属性的具体需求。如果属性仅需要基本的读写操作,那么自动生成的方法通常足够。如果需要添加额外的控制逻辑或验证逻辑,那么自定义的方法可以提供更大的灵活性。
玄子Share-ChatGPT:使用 public 属性,还是使用getter setter

相关推荐
月亮不月亮13 分钟前
月亮商场购物打折Java
java·eclipse
guozhetao23 分钟前
【ST表、倍增】P7167 [eJOI 2020] Fountain (Day1)
java·c++·python·算法·leetcode·深度优先·图论
技术思考者24 分钟前
基础很薄弱如何规划考研
java·经验分享·考研
●VON1 小时前
重生之我在暑假学习微服务第二天《MybatisPlus-下篇》
java·学习·微服务·架构·mybatis-plus
老华带你飞1 小时前
口腔助手|口腔挂号预约小程序|基于微信小程序的口腔门诊预约系统的设计与实现(源码+数据库+文档)
java·数据库·微信小程序·小程序·论文·毕设·口腔小程序
hqxstudying1 小时前
J2EE模式---服务层模式
java·数据库·后端·spring·oracle·java-ee
GM_8281 小时前
【最新最完整】SpringAI-1.0.0开发MCP Server,搭建MCP Client 实战笔记(进阶+详细+完整代码)
java·后端·ai编程·springai·mcp
都叫我大帅哥1 小时前
Java DelayQueue:时间管理大师的终极武器
java
秋千码途1 小时前
小架构step系列27:Hibernate提供的validator
java·spring·架构·hibernate
都叫我大帅哥1 小时前
TOGAF迁移规划阶段全解密:从菜鸟到达人的通关秘籍
java