后端与系统架构2939 字

Effective Java 最佳应用实践

·全库 552 / 611

《Effective Java 最佳应用实践》共 0.3 万字,通篇围绕 安全、私有化、微服务、场景 展开,归在「后端与系统架构」这一层。

覆盖安全私有化微服务场景架构数据库

适合给 AI 系统搭底座、要管得住的人

目录骨架(6 节)
  1. 一 创建和销毁对象篇
  2. **二 类和接口篇**
  3. **三 泛型篇**
  4. **四 方法篇**
  5. **五 通用程序设计篇**
  6. **六 异常**

示例代码

注:将ppt后缀名改为zip后解压

jdk版本:1.8.0_181

​

本次分享内容

《Effective Java》是一本经典的 Java 学习宝典,值得每位 Java 开发者阅读。本节课将分享书中与平日工作里较密切的知识点

1、创建和销毁对象篇

2、类和接口篇

3、泛型篇

4、方法篇

5、通用程序设计篇

6、异常

​

一 创建和销毁对象篇

1 若有多个构造器参数时,优先考虑构造器

当类构造包含多个参数时,同学们会选择 JavaBeans 模式。在这种模式下,可以调用一个无参构造器来创建对象,然后调用 setter 方法来设置必要和可选的参数。目前较受欢迎的方法之一如在类上加入 Lombok 提供的 @Data 注解,来自动生成 getter/setter、equals 等方法。但是 JavaBeans 模式无法将类做成不可变(immutable,详见 “使可变形最小化” 章节)。这就需要开发者自己掌控值的更新情况,确保线程安全等。

推荐:Builder 模式

Builder 模式通过 builder 对象上,调用类似 setter 的方法,设置相关的参数(类似 Proto Buffers)。最后,通过调用 build 方法来生成不可变的对象(immutable object)。使用 Builder 模式的方法之一包括在类上加入 Lombok 提供的 @Builder 注解。

应用:API Request & Response

在微服务架构中,服务的请求(request)和响应(response)往往包含较多参数。在处理请求的过程中,常常会担心误操作修改了请求的内容。所以,建议使用 Builder 模式。

我们可使用 Builder 模式来构建该类型对象。在构建过程中,若需要引入额外逻辑(e.g. if-else),可先返回 Builder 对象,最后再调用 build 方法。

import lombok.Builder;
/** 请求类 */
@Builder
public class SampleRequest {
    private String paramOne;
    private int paramTwo;
    private boolean paramThree;
}
/** 响应类 */
@Builder
public class SampleResponse {
    private boolean success;
}
/** 服务接口 */
public interface SampleFacade {
    Result<SampleResponse> rpcOne(RequestParam<SampleRequest>);
}
/** 调用 */
public void testRpcOne() {
    SampleRequest request =
    SampleRequest.builder().paramOne("one").paramTwo(2).paramThree(true).build();
    Result<SampleResponse> response = 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)。这里推荐 PowerMock 单元测试框架。PowerMock 是 Mockito 的加强版,可以实现完成对 private/static/final 方法的 Mock(模拟)。通过加入 @PrepareForTest 注解来实现。

public class UserEntity {
    private String callMethod() {
        return "Method";
    }

    private static String callStaticMethod() {
        return "Static Method";
    }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest({UserEntity.class})
public class PrivateDataTest {
    @Test
    public void testPrivate() throws Exception {
        UserEntity user = new UserEntity();
        /** 测试私有的 callMethod 方法 */
        //user.callMethod();
        System.out.println(Whitebox.invokeMethod(user, "callMethod").toString());
        //UserEntity.callStaticMethod();
        System.out.println(Whitebox.invokeMethod(UserEntity.class, "callStaticMethod").toString());
    }
}

资料里没有你的场景?

把你手上的数据和想解决的那个环节发上来,我们按具体情况回,不复述方法论。

发布需求