Java 三大基础特性の封装

432 阅读4分钟

这是我参与8月更文挑战的第 17 天,活动详情查看:8月更文挑战

定义

将类的某些信息隐藏在类的内部,不允许外部成员 直接访问,如果确认有必要,暴露出去,如对于私有的类成员,会考虑提供 get/set

缺点

样板代码会很多,整个 class 会显得非常的冗余。好消息是 IDE 会提供一键生成的功能

优点

对于一些私有的成员,可以选择是否暴露出去,同时,也可以在这一步 对输出数据做处理,对输入的数据做校验

Lombok 插件

由于 Java 开发中约定俗成的理念,我们编写实体类的时候,一般会定义属性私有,然后提供全套的 get/set。当然,也可以取巧,通过使用 lombok@Data 注解来抛开这些麻烦事

优点

使用注解的方式能简化大量的 java 样板代码

缺点

强制项目参与人员必须全部用上,就是这个强耦合性让人大为诟病

如果是新项目的话,建议规划的时候团队就使用这个,是真的香

图片.png

常用注解

下面几个注解,都是需要声明在 class 上,一般编写实体类时,直接写上这几个注解就行 @Data, NoArgsConstructor, @ToString

@Data

为所有的属性提供 get/set 标准方法

@NoArgsConstructor

提供一个无参构造器

@ToString

重写 class 自带的 toString(),输出类似 json 格式的、便于阅读的数据

@AllArgsConstructor

提供全参的构造器,参数顺序与属性定义的顺序有关

如果 class 经常变动,不建议使用,会影响到其他使用了旧版全参构造器的代码

@EqualsAndHashCode

重写 class 中的 equals(), hashCode()

项目中最常用的,就上面几个,这里附上 Lombok 官网

原理

Lombok利用Java的插入式注解处理器提供的API,读取、修改、添加抽象语法树中的任意元素。如果因为这些注解对语法树进行了修改,编译器会重新进行词法、语法的分析处理,直到所有的插入式注解没有对语法树进行修改为止。

所以,如果我们需要使用 lombok,还需要配置好我们的 IDE,让 IDE 在我们编码的时候,能够关联到注解提供的对应的方法上

图片.png

作用域

第三方:也可以称为是库类的使用者,服务的消费者

我们:一般是库类的开发者,服务的提供者

public

全局作用域,表示将某个 变量、方法 声明为支持全局调用

default

或者不显示指定,表示是当前的包作用域,常规用法为:我们需要开发一个稍微复杂的库类时,通常会将相关的文件全部放置在一个包目录下供其他组件相互调用,但不想暴露给第三方

小知识点:在接口中声明的不带作用域的方法、变量等,默认作用域都是 public

protected

当父类中的属性、方法需要能够给 不同包 的子类使用,并且,又不想暴露在外被 随意访问

private

私有的,仅自己可用

比如,我们要实现一个简单的单例模式时,需要将构造器声明为 私有的,避免被其他人无意识的初始化了一个新的实例来覆盖掉我们精心编写的实例

控制作用域的好处

严格限制服务的作用域,避免内部使用的服务被第三方使用,这样的一个目的是,我们需要有权利对内部的服务进行迭代升级,而这些内部服务进过组装、包装后,变成更高一层的服务以供外部调用使用。对外提供的服务,严格要求方法名、出参、入参均不可改变(避免对第三方调用者造成影响)

若因为库类设计的缺陷,确实需要对为第三方服务的方法进行优化,改写,建议先使用 Java 提供的表示 方法/类 过期的注解 @Deprecated 标注在相关的方法上,为第三方提供数个版本的缓冲时间,最后再移除