Effective Java for Android (cheatsheet)

《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();
    }
    [...]
}

原文链接

你可能感兴趣的:(Effective Java for Android (cheatsheet))