首页 > 其他分享 >将POJO类的成员全部设置为public多省事儿

将POJO类的成员全部设置为public多省事儿

时间:2024-10-30 14:59:23浏览次数:2  
标签:inventoryVo 封装 String 子类 成员 多省 POJO public

最近浏览一个项目的代码时发现,其中有一些以前提交的编码,定义的一些类(不管他是POJO、DTO、DAO、PO、BO、VO、QO、ENTITY还是就是个对象,不重要。总之就是数据传输对象。),这些类他的写法非常的潇洒,属性全部是public的,没有任何的get、set方法,看起来非常干净、整洁。比如基本都像下面这样

public class InventoryVo {
    @JSONField(name = "pk")
    public String id;
    @JSONField(name = "itemName")
    public String name;
    public Integer quantity;
    public String skuCode;
    public String pid;

}

//使用的地方也非常的方便
//由其他层获取到数据tradeDetail,这里的业务层接入,然后转为了json,准备请求一个http接口.
EastInventoryVo inventoryVo = new EastInventoryVo();
inventoryVo.id="10000000001";
inventoryVo.name=tradeDetail.getProductName();
inventoryVo.quantity=tradeDetail.getQuan();
inventoryVo.skuCode=tradeDetail.getProductCode();
inventoryVo.setLocator(tradeDetail.getFormArea();
String jsonString = JSON.toJSONString(inventoryVo);

公开所有成员给外部直接访问

从业务逻辑上来看,他实现了功能,没有任何问题,看起来代码干净,丝滑,甚至我都觉得大家总是写get、set,总是搞什么封装,搞什么面向对象有点多余了,这让我蠢蠢欲动啊 wa哇哇image,必须来一下image。难道我们写那么多的私有成员,然后共有方法访问,多此一举吗??

那句话叫什么,一时编码一时爽,一直编码一直爽。不。。跑错片场了。这里真的是一时编码一时爽,维护就是火葬场

从编码规范来说

  • 没什么多说的,无论是公司内部现行的java编程规范,还是阿里的泰山版、嵩山班当中都未有明确说明不许这样。 所以说他做的很好,对吧,啊对对是的!快速完成任务,你就说屌不屌吧。 image
    然后陷入思考,为什么,为什么没有加入这一条,是因为默认大家都懂OOP,都知道面向编程的基本特点,和基本原则吧。
  • 但是,如果我们使用一些静态代码分析工具绝逼会全部提示出来。(如 SonarQube、Checkstyle)会检测未封装的字段,并提示开发者进行改进。
  • 其实很多业内的编码规范(如 Google Java Style Guide、Oracle Java Coding Conventions)都强调封装的重要性,将其作为编写高质量代码的标准之一。
  • 这历史代码没有做代码审查吗,是的,太那个了,我还没来不知道呢

从OOP的角度来看

  • 我们天天喊着封装、继承、多态,为什么要封装起来,成员全部裸奔、全部对外开放,多方便,很符合开放精神的。从眼前实现功能上来看,确实很快,但稍微想一下就会发现这种裸奔的现象,不受控制的玩法,就好比去大街道上给所有人展示自己,谁也可以来访问,随时随地上手image
  • 破坏内聚性,封装确保类的内部状态和行为是内聚的,不会因为外部的变化而频繁修改。如果这样的类被到处使用,后续想扩展和对成员变量做控制就得将使用它的地方全部修改,而无法再此类的内部完成,也就是说同时破坏了单一职责原则、开闭原则
  • 在《Java编程思想》和《Effective Java》中都有专门对类成员的可访问性做阐述,指出不使用封装所带来的弊端“要在公有类而非公有域中使用访问方法”、“使可变性最小化”。简单说就是这种类,如果是确定在内部某一个地方使用,类本身不是公有的情况下,而且本来就一个地方使用,那么采用公有的形式定义全部开放是可以的,但绝大多数情况下应该遵循封装的原则,保证类的内部状态。

比如上面的InventoryVo 这个类,我现在要对quantity做一个简单的正数判断,如何处理,在每一个调用它的地方去加一个判断吗?如果要想在类的内部实现呢,你会发现开始难受了,大家都直接访问的成员变量,又没对外提供方法,还没法处理了
在比如我现在有个需求,基本字段和InventoryVo一样,只是新增几个自己的字段,同时又不想展示skuCode、pid这些字段,如何实现??

//继承了InventoryVo,添加了自己的扩展,但是没法覆盖父类的公有字段,更不可能覆盖访问修饰符,像上面说的,要屏蔽掉几个字段,发现没办法屏蔽。总之要基于InventoryVo来做扩展变得困难。
//有人会说那你子类也定义个 String skuCode等字段,然后提供方法,控制访问不就行了?宝,那样不行,JSL已经规定子类覆盖不了父类的公有字段,你只能通过super去访问。而如果你也同样在子类定义成public的,当你是用 父类() x = new 子类() 的形式定义对象,然后用x.skuCode你猜使用的谁的?那如果在改成 子类() x = new 子类(),又使用的谁的?
public class EastInventoryVo extends InventoryVo {
    private String locator;
    private String batchNo;

    public String getLocator() {
        return this.locator;
    }
    public void setLocator(String locator) {
        this.locator = locator;
    }

    public String getBatchNo() {
        return this.batchNo;
    }
    public void setBatchNo(String batchNo) {
        this.batchNo = batchNo;
    }
}

从java语言规范(JLS)来看

  • 声明为 private 的类的成员不会被该类的子类继承。
  • 只有声明受保护或公共的类的成员才能由声明该类的包以外的包中声明的子类继承。
  • 构造函数、静态初始值设定项和实例初始值设定项不是成员,因此不能继承。
  • 类的字段、方法、成员类和成员接口可以具有相同的名称,因为它们在不同的上下文中使用,并且由不同的查找过程消除歧义(6.5)。然而,作为一种风格,这是不被鼓励的。
    https://docs.oracle.com/javase/specs/jls/se17/html/jls-8.html#d5e13645

PS

其实尽可能按照OOP的原则来实现编码,可读性、可扩展性、可维护性都会提高,就算是一个简单的POJO类,如今的IDE都支持直接生成get/set方法、构造方法等,非常方便,必要的时候直接生成即可。当然也不是说所有的POJO类,都必须生成get/set方法,加入判断等,而是依据实际情况来具体处理。

标签:inventoryVo,封装,String,子类,成员,多省,POJO,public
From: https://www.cnblogs.com/Nuwa/p/18514089

相关文章

  • C# 中的 public、static 和 void 关键字有什么区别
    在C#编程语言中,public、static和void都是关键字,但它们具有不同的目的和用途。public是一个访问修饰符,表示类或类的成员可以从任何地方访问;static指定某一成员属于类型本身,而不是某个对象实例;而void是一个返回类型,表示方法不返回任何值。理解这三个关键字的核心差异对于编写高效和......
  • Public NOIP Round #7
    A答案为\(\sum\limits_{k\ge0}\sum\limits_{i=1}^n\sum\limits_{j=1}^n[a_i+b_j\ge10^k]\)。先把\(a,b\)排序,枚举\(k\)后双指针统计答案即可。时间复杂度\(O(n(\logn+\logV))\)。B若\(|a_i-a_j|=k\)就在它们之间连一条无向边。因为保证序列没有......
  • Public NOIP Round #7 T3 黑白棋子 题解
    Description有一棵\(n\)个点的树,顶点的编号为\(1\)到\(n\)。对于树中的每个顶点,可能存在一个白色的棋子、一个黑色的棋子,或者没有棋子。树上正好有\(w\)个白色棋子和\(b\)个黑色棋子。另外,对于每一对具有相同颜色棋子的顶点,存在一条路径,路径上的每个顶点都包含相同颜色......
  • thinkphp 设置运行目录为/public后 404错误
    当你在ThinkPHP中设置了运行目录为 /public 后,可能会遇到404错误。这通常是因为Web服务器的配置问题导致的。以下是解决这个问题的几个步骤:1.修改 .htaccess 文件如果你使用的是Apache服务器,需要确保 .htaccess 文件正确配置。在项目根目录下创建或修改 .htacce......
  • DBeaver 连接 mysql 报错:Public Key Retrieval is not allowed
    前言DBeaver连接mysql报错:PublicKeyRetrievalisnotallowed遇到"PublicKeyRetrievalisnotallowed"错误时,通常意味着你正在使用的身份验证方法需要加密连接,但是没有正确地配置客户端或服务器来支持这种加密。解决第一种可以在连接字符串中添加 allowPublicKey......
  • CSP-JS多省分数线分析!复赛如何准备?(附复赛流程视频)
    截止目前已经有多个省份CSP-JS的分数线已经出了,很多省份比去年提升了不少,像河南等地都提升了20多分,不过也有一些省份,天津比去年提升分数却不是很多。还有很多省份分数线没出,各位家长想要预估是否能够晋级的,以下是已出分数线省份表格统计:目前已出分数线省份省份入门组......
  • 沃通SSL证书上线政采云多省区电子卖场,助力政府数字化采购
    近年来,沃通CA已入驻政采云平台浙江、吉林、湖南、云南、广西、新疆、新疆生产建设兵团等多省区电子卖场,沃通WoTrus官方旗舰店在各省区共计上架沃通SSL证书、国密SSL证书等产品规格三十余个,为各省区SSL证书政府采购客户,提供多样化的产品供应以及便捷的采购流程。为了推动政企采购流......
  • DTO和POJO的区别
    在Java企业应用开发中,POJO(PlainOldJavaObject)和DTO(DataTransferObject)是两种常用的数据对象,它们在不同的上下文中扮演不同的角色:POJO(PlainOldJavaObject):定义:POJO是一个简单的Java对象,通常用于表示数据模型,如数据库中的表。它通常包含属性、getter和setter方法,以及可能......
  • 【题解】「Public NOIP Round #2」找零
    【题解】「PublicNOIPRound#2」找零[官解](PublicNOIPRound#2题解-博客-Qingyu的博客(pjudge.ac))Tag:背包、dp凸优化决策点单调触碰到知识点盲区了,所以来写几笔。首先,由于我们只关心最终状态下\(1\)的最多个数,其实有用的面值只有\(5,1\)(其她的可以当成若干......
  • MySQL 8.0 Public Key Retrieval is not allowed 错误的解决方法
    原文:MySQL8.0PublicKeyRetrievalisnotallowed错误的解决方法参考:ConnectionJava-MySQL:PublicKeyRetrievalisnotallowed在使用MySQL8.0时重启应用后提示com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:PublicKeyRetrievalis......