《Effective Java》这本书中的内容并不是所有都适合Android开发,比如 enums, serialization以及由于手机限制跟桌面级的虚拟机的区别。(安卓使用dalvik/art虚拟机)
Force non-instantiability
对于一些无需创建的object强制使用私有的构造器,比如一些工具类。
class MovieUtils {
private MovieUtils() {}
static String titleAndYear(Movie movie) {
[...]
}
}
Static Factories
使用静态工厂方法(当然是private constructor)代替new关键字和构造器,这样可以根据需要返回不同的子类型(subtype)
class Movie {
[...]
public static Movie create(String title) {
return new Movie(title);
}
}
Builders
如果你的object有3个以上的构造器参数,那么建议使用builder来创建你的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
不可变就是这个object创建后一直保持一样,好处就是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
假如你定义了一个内部类,并且这个内部类不依赖外部类,那么就用static修饰,避免每次初始化内部类都会有外部类的引用。
class Movie {
[...]
static class MovieAward {
[...]
}
}
Generics (almost) everywhere
java提供了类型安全检查,在编译的时候,所以避免使用raw type或者object type
// DON'T
List movies = Lists.newArrayList();
movies.add("Hello!");
[...]
String movie = (String) movies.get(0);
// DO
List movies = Lists.newArrayList();
movies.add("Hello!");
[...]
String movie = movies.get(0);
不要忘记可以使用泛型在你的方法参数和返回值里面
// DON'T
List sort(List input) {
[...]
}
// DO
List sort(List input) {
[...]
}
Return empty
假如你必须返回一个集合但是又查询不到数据的时候,返回一个空集合避免NPE(空指针)。优先返回same empty collection而不是创建一个新的。
List latestMovies() {
if (db.query().isEmpty()) {
return Collections.emptyList();
}
[...]
}
No + String
如果有很多字符串需要拼接,避免使用+号,因为性能实在太差,建议使用StringBuilder代替
String latestMovieOneLiner(List movies) {
StringBuilder sb = new StringBuilder();
for (Movie movie : movies) {
sb.append(movie);
}
return sb.toString();
}
Recoverable exceptions
检查异常并且能够从异常中恢复
List latestMovies() throws MoviesNotFoundException {
if (db.query().isEmpty()) {
throw new MoviesNotFoundException();
}
[...]
}
原文链接