Java是最流行的编程语言之一,但似乎并没有人喜欢使用它。好吧,实际上Java是一门还不错的编程语言,由于最近Java 8发布了,我决定来编辑一个如何能更好地使用Java的列表,这里面包括一些库,实践技巧以及工具。
这篇文章在GitHub上也有。你可以随时在上面贡献或者添加你自己的Java使用技巧或者最佳实践。
编码风格
结构体
builder模式
依赖注入
避免null值
不可变
避免过多的工具类
格式
文档
Stream
部署
框架
Maven
依赖收敛
持续集成
Maven仓储
配置管理
库
遗失的特性
Apache Commons
Guava
Gson
Java Tuples
Joda-Time
Lombok
Play framework
SLF4J
jOOQ
jUnit 4
jMock
AssertJ
工具
IntelliJ IDEA
Chronon
JRebel
校验框架
Eclipse Memory Analyzer
资源
书籍
播客
编码风格
传统的Java编码方式是非常啰嗦的企业级JavaBean的风格。新的风格更简洁准确,对眼睛也更好。
结构体
我们这些码农干的最简单的事情就是传递数据了。传统的方式就是定义一个JavaBean:
public class DataHolder {
private String data;
public DataHolder() {
}
public void setData(String data) {
this.data = data;
}
public String getData() {
return this.data;
}
}
这不仅拖沓而且浪费。尽管你的IDE可以自动地生成这个,但这还是浪费。因此,不要这么写。
相反的,我更喜欢C的结构体的风格,写出来的类只是包装数据:
public class DataHolder {
public final String data;
public DataHolder(String data) {
this.data = data;
}
}
这样写减少了一半的代码。不仅如此,除非你继承它,不然这个类是不可变的,由于它是不可变的,因此推断它的值就简单多了。
如果你存储的是Map或者List这些可以容易被修改的数据,你可以使用ImmutableMap或者ImmutableList,这个在不可变性这节中会有讨论。
Builder模式
如果你有一个相对复杂的对象,可以考虑下Builder模式。
你在对象里边创建一个子类,用来构造你的这个对象。它使用的是可修改的状态,但一旦你调用了build方法,它会生成一个不可变对象。
想象一下我们有一个非常复杂的对象DataHolder。它的构造器看起来应该是这样的:
public class ComplicatedDataHolder {
public final String data;
public final int num;
// lots more fields and a constructor
public class Builder {
private String data;
private int num;
public Builder data(String data) {
this.data = data;
return this;
}
public Builder num(int num) {
this.num = num;
return this;
}
public ComplicatedDataHolder build() {
return new ComplicatedDataHolder(data, num); // etc
}
}
}
现在你可以使用它了:
final ComplicatedDataHolder cdh = new ComplicatedDataHolder.Builder()
.data("set this")
.num(523)
.build();
关于Builder的使用这里还有些更好的例子,我这里举的例子只是想让你大概感受一下。当然这会产生许多我们希望避免的样板代码,不过好处就是你有了一个不可变对象以及一个连贯接口。
依赖注入
这更像是一个软件工程的章节而不是Java的,写出可测的软件的一个最佳方式就是使用依赖注入(Dependency injection,DI)。由于Java强烈鼓励使用面向对象设计 ,因此想写出可测性强的软件,你需要使用DI。
在Java中,这个通常都是用Spring框架来完成的。它有一个基于XML配置的绑定方式,并且仍然相当流行。重要的一点是你不要因为它的基于XML的配置格式而过度使用它了。在XML中应该没有任何的逻辑和控制结构。它只应该是依赖注入。
原文转自:http://it.deepinmind.com/java/2014/05/21/better-java.html