一、出处
这是一篇来自github上Android类热门项目的文章,地址 点此查看原文。
二、翻译
如何在Android中有效使用Java
构建者模式
如果某对象有大于等于三个参数时,考虑使用构建者模式创建对象,尽管冗余点,但是扩张性和可读性都非常好。如果需要创建java Bean这类对象,请使用AutoValue.
class Movie {
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 = new Movie.Builder().withTitle("The Matrix").build();
静态工厂方法
使用经过命名静态工厂方法(需要构造的对象的构造方法私有化)而非使用 new
关键字及构造方法可以不用每次返回一个新的对象并且可以根据需求返回不同的子类。
class Movie {
[...]
public static Movie create(String title) {
return new Movie(title);
}
}
静态内部类
如果需要定义一个不需要持有外部类引用的内部类,记得将其定义成静态的,不这样做可能会导致每个内部类都持有一个外部类的引用。
class Movie {
[...]
static class MovieAward {
[...]
}
}
返回空集合
有些情况下,不得不返回一个可能为空的集合时,可以返回一个特别简单的接口(无需使用注释或者注解来标注该方法)来返回一个空集合就可以避免空指针异常。优先使用同一个空集合而不用创建一个新的集合。
List<Movie> latestMovies() {
if (db.query().isEmpty()) {
return Collections.emptyList();
}
[...]
}
使用StringBuilder
连接短小的字符串时可以使用+
运算符,但是用其连接太多的字符串效率的确不高,优先使用StringBuilder。
String latestMovieOneLiner(List<Movie> movies) {
StringBuilder sb = new StringBuilder();
for (Movie movie : movies) {
sb.append(movie);
}
return sb.toString();
}
强制非实例化
如果不想对象使用new
关键字实例化,强制私有化构造方法,尤其是对只含有静态方法的工具类十分实用。
class MovieUtils {
private MovieUtils() {}
static String titleAndYear(Movie movie) {
[...]
}
}
避免易变性
不可变性是指对象在其生命周期内保持原样。所有对象所需的数据都会在创建是获得。这种方法有诸如简洁、线程安全、可共享等好处。
class Movie {
[...]
Movie sequel() {
return Movie.create(this.title + " 2");
}
}
// Use like this:
Movie toyStory = Movie.create("Toy Story");
Movie toyStory2 = toyStory.sequel();
促使每个类都不可变并不容易。在情景需要,尽可能地让类不可变(比如将类成员设置成private final
或者将类设置成 final
).对象的创建在移动端弥足珍贵,所以不能忽略。
网友评论