Java|Effective Java 在工作中的应用总结

文章图片
《Effective Java》是一本经典的 Java 学习宝典 , 值得每位 Java 开发者阅读 。 笔者将书中和平日工作较密切的知识点做了部分总结 。
一 创建和销毁对象篇 1 若有多个构造器参数时 , 优先考虑构造器
当类构造包含多个参数时 , 同学们会选择 JavaBeans 模式 。 在这种模式下 , 可以调用一个无参构造器来创建对象 , 然后调用 setter 方法来设置必要和可选的参数 。 目前较受欢迎的方法之一如在类上加入 Lombok 提供的@Data注解 , 来自动生成getter/setter、equals 等方法 。 但是JavaBeans模式无法将类做成不可变(immutable , 详见“使可变形最小化”章节) 。 这就需要开发者自己掌控值的更新情况 , 确保线程安全等 。
推荐:Builder模式
Builder 模式通过 builder 对象上 , 调用类似 setter 的方法 , 设置相关的参数(类似 Proto Buffers) 。 最后 , 通过调用 build 方法来生成不可变的对象(immutable object) 。 使用 Builder 模式的方法之一包括在类上加入 Lombok 提供的 @Builder 注解 。
应用:API RequestResponse
在微服务架构中 , 服务的请求(request)和响应(response)往往包含较多参数 。 在处理请求的过程中 , 笔者也常常会担心误操作修改了请求的内容 。 所以 , 笔者倾向使用Builder模式 。
【Java|Effective Java 在工作中的应用总结】我们可使用Builder模式来构建该类型对象 。 在构建过程中 , 若需要引入额外逻辑(e.g. if-else) , 可先返回Builder对象 , 最后再调用build方法 。
import lombok.Builder;/** 请求类 */@Builderpublic class SampleRequest { private String paramOne; private int paramTwo; private boolean paramThree;/** 响应类 */@Builderpublic class SampleResponse { private boolean success;/** 服务接口 */public interface SampleFacade { ResultSampleResponserpcOne(RequestParamSampleRequest);/** 调用 */public void testRpcOne() { SampleRequest request = SampleRequest.builder().paramOne(\"one\").paramTwo(2).paramThree(true).build(); ResultSampleResponseresponse = sampleFacade.rpcOne(request); 2 通过私有构造器强化不可实例化的能力
有些类 , 例如工具类(utility class) , 只包含静态字段和静态方法 。 这些类应尽量确保不被实例化 , 防止用户误用 。
推荐:私有化类构造器
为了防止误导用户 , 认为该类是专门为了继承而设计的 , 我们可以将构造器私有化 。
public class SampleUtility { public static String getXXX() { return \"test\";/** 私有化构造器 */ private SampleUtility() {/** 直接调用方法 */public static void main(String[
args) { System.out.println(SampleUtility.getXXX()); 二 类和接口篇 1 最小化类和成员的可访问性
尽可能地使每个类或者成员不被外界访问 。
推荐:有的时候 , 为了测试 , 我们不得不将某些私有的(private)类、接口或者成员变成包级私有的(package-private) 。 这里 , 笔者推荐大家使用 Guava 提供的 @VisiableForTesting 注解 , 来提示这是为了测试而使可访问级别变为包级私有 , 放宽了限制 。
import com.google.common.annotations.VisibleForTesting;@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)String getXXX() { return \"test\"; 此外 , 也有小伙伴推荐 PowerMock 单元测试框架 。 PowerMock 是 Mockito 的加强版 , 可以实现完成对private/static/final方法的Mock(模拟) 。 通过加入 @PrepareForTest 注解来实现 。
public class Utility { private static boolean isGreaterThan(int a int b) { return ab;private Utility() {/** 测试类 */import org.junit.Test;import org.junit.jupiter.api.Assertions;import org.junit.runner.RunWith;import org.powermock.core.classloader.annotations.PrepareForTest;import org.powermock.modules.junit4.PowerMockRunner;import org.powermock.reflect.Whitebox;@RunWith(PowerMockRunner.class)@PrepareForTest({Utility.class)public class UtilityTest { @Test public void test_privateIsGreaterThan_success() throws Exception { /** 测试私有的 isGreaterThan 方法 */ boolean result = Whitebox.invokeMethod(Utility.class \"isGreaterThan\" 3 2); Assertions.assertTrue(result);2 使可变形最小化
- meta|促进更逼真AR/VR体验,Meta正在开发全新空间音频工具
- 在昨日推文中,王者荣耀将以“____文化”为主题推出限定皮肤,为乡村振兴加油? 王者荣耀6月28日每日一题答案
- ColorOS|绿厂又在憋大招?新系统和新产品接踵而至
- 零售业|确定涨价!iPhone14四款新机全面涨价!国行也在其中!
- 数字化转型|新一代iPad Pro正在路上 外观、配置大升级
- 月球也在太阳系的宜居带中,为何不能产生生命?原来个头太小了
- 在南极3500米的深海,科学家发现新物种,这是个透明的肉球?
- 新发现恐龙可能在灾难性的太空岩石撞击地球之前就已经灭绝了
- 中美科学家在琥珀中发现1亿年前的虱子,它们以恐龙羽毛为食
- 为什么现在很少有人提及“克隆技术”了?“克隆技术”有何缺点?
