性能优化
性能优化
性能优化
并发编程
如上图所示,Java 中所有变量都存储在主存中,并对所有线程共享。线程都有自己的私有工作内存,保存主存中某些变量的拷贝。线程对所有变量的操作都是在工作内存中进行。线程之间无法相互直接访问,变量传递均需要通过主存完成。安全的同步共享数据必须使用锁机制。
应用架构
安全编码
代码风格
所谓的编程规范与样式指南即是希望通过制定对语言常见特性和使用注意事项的细则描述,提升编程技能,保证项目的可维护、易重构、易理解、易实现等特性。
代码风格
Clean Code
命名与格式化
函数式编程
Lambda
避免过度臃肿的 Lambda 实现
在将早期的代码迁移到 Java 8 中基于 Lambda 的函数式风格时,往往会生硬地将类中的代码迁移过去:
List<Person> persons = ...;
persons.stream().filter(p -> {
if (p.getGender() == Gender.MALE) {
return true;
}
LocalDate now = LocalDate.now();
Duration age = Duration.between(p.getBirthDate(), now);
Duration adult = Duration.of(18, ChronoUnit.YEARS);
if (age.compareTo(adult) > 0) {
return true;
}
return false;
}).map(p -> p.getFirstName() + " " + p.getLastName())
.collect(Collectors.toList());
作为典型的面向对象的语言,我们还是应该将与对象相关的代码封装到类中:
public class Person {
// ...
public boolean isMale() {
return getGender() == Gender.MALE;
}
public boolean isAdult(LocalDate when) {
Duration age = Duration.between(birthDate, when);
Duration adult = Duration.of(18, ChronoUnit.YEARS);
return age.compareTo(adult) > 0;
}
}
然后简要地提升下 Lambda 以及 Stream 代码的可读性:
// Implementation details
Predicate<Person> isMaleOrAdult = p -> {
if (p.isMale()) {
return true;
}
LocalDate now = LocalDate.now();
if (p.isAdult(now)) {
return true;
}
return false;
};
Function<Person, String> concatenateFirstAndLastName = p -> p.getFirstName() + " " + p.getLastName();
// Core
persons.stream().filter(isMaleOrAdult).map(concatenateFirstAndLastName)