Effective Java 最佳应用实践
《Effective Java 最佳应用实践》共 0.3 万字,通篇围绕 安全、私有化、微服务、场景 展开,归在「后端与系统架构」这一层。
适合给 AI 系统搭底座、要管得住的人
目录骨架(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());
}
}