《Effective Java》這本書中的內(nèi)容并不是所有都適合Android開發(fā)耻矮,比如 enums, serialization以及由于手機(jī)限制跟桌面級(jí)的虛擬機(jī)的區(qū)別琼娘。(安卓使用dalvik/art虛擬機(jī))
Force non-instantiability
對(duì)于一些無需創(chuàng)建的object強(qiáng)制使用私有的構(gòu)造器,比如一些工具類鸡典。
class MovieUtils {
private MovieUtils() {}
static String titleAndYear(Movie movie) {
[...]
}
}
Static Factories
使用靜態(tài)工廠方法(當(dāng)然是private constructor)代替new關(guān)鍵字和構(gòu)造器播揪,這樣可以根據(jù)需要返回不同的子類型(subtype)
class Movie {
[...]
public static Movie create(String title) {
return new Movie(title);
}
}
Builders
如果你的object有3個(gè)以上的構(gòu)造器參數(shù)富稻,那么建議使用builder來創(chuàng)建你的object
class Movie {
static Builder newBuilder() {
return new Builder();
}
static class Builder {
String title;
Builder withTitle(String title) {
this.title = title;
return this;
}
Movie build() {
return new Movie(title);
}
}
private Movie(String title) {
[...]
}
}
// Use like this:
Movie matrix = Movie.newBuilder().withTitle("The Matrix").build();
Avoid mutability
不可變就是這個(gè)object創(chuàng)建后一直保持一樣,好處就是simplicity, thread-safety 和 shareability.
class Movie {
[...]
Movie sequel() {
return Movie.create(this.title + " 2");
}
}
// Use like this:
Movie toyStory = Movie.create("Toy Story");
Movie toyStory2 = toyStory.sequel();
盡可能的給你的(class使用final)和(private final修飾field)
Static member classes
假如你定義了一個(gè)內(nèi)部類汪诉,并且這個(gè)內(nèi)部類不依賴外部類废恋,那么就用static修飾,避免每次初始化內(nèi)部類都會(huì)有外部類的引用扒寄。
class Movie {
[...]
static class MovieAward {
[...]
}
}
Generics (almost) everywhere
java提供了類型安全檢查鱼鼓,在編譯的時(shí)候,所以避免使用raw type或者object type
// DON'T
List movies = Lists.newArrayList();
movies.add("Hello!");
[...]
String movie = (String) movies.get(0);
// DO
List<String> movies = Lists.newArrayList();
movies.add("Hello!");
[...]
String movie = movies.get(0);
不要忘記可以使用泛型在你的方法參數(shù)和返回值里面
// DON'T
List sort(List input) {
[...]
}
// DO
<T> List<T> sort(List<T> input) {
[...]
}
Return empty
假如你必須返回一個(gè)集合但是又查詢不到數(shù)據(jù)的時(shí)候该编,返回一個(gè)空集合避免NPE(空指針)迄本。優(yōu)先返回same empty collection而不是創(chuàng)建一個(gè)新的。
List<Movie> latestMovies() {
if (db.query().isEmpty()) {
return Collections.emptyList();
}
[...]
}
No + String
如果有很多字符串需要拼接上渴,避免使用+號(hào)岸梨,因?yàn)樾阅軐?shí)在太差,建議使用StringBuilder代替
String latestMovieOneLiner(List<Movie> movies) {
StringBuilder sb = new StringBuilder();
for (Movie movie : movies) {
sb.append(movie);
}
return sb.toString();
}
Recoverable exceptions
檢查異常并且能夠從異常中恢復(fù)
List<Movie> latestMovies() throws MoviesNotFoundException {
if (db.query().isEmpty()) {
throw new MoviesNotFoundException();
}
[...]
}