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