class Movie {
[...]
public static Movie <strong>create</strong>(String title) {
return new Movie(title);
}
}
【更新】读者 @ stsdema28 提出了一个有用的建议:使用静态工厂会使得测试变得困难。如果这样的话,不妨考虑使用一个非静态的工厂用于在测试时进行模拟(或者一个能够实现的工厂接口)。
class Movie {
static Builder newBuilder() {
return new Builder();
}
static class <strong>Builder</strong> {
String title;
Builder <strong>withTitle</strong>(String title) {
this.title = title;
return this;
}
Movie <strong>build</strong>() {
return new Movie(title);
}
}
private Movie(String title) {
[...]
}
}
// Use like this:
Movie matrix = Movie.<em>newBuilder</em>().withTitle("The Matrix").build();
避免可变性
不可变对象在其整个生命周期中都保持不变。所有需要的数据都在对象创建时提供。这种方式有着多种优点,如简单,线程安全以及可共享。
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 类声明)。在移动设备上创建对象代价更加昂贵,因此不要过度使用。
class Movie {
[...]
<strong>static</strong> class MovieAward {
[...]
}
}
泛型(几乎)无处不在
Java 提供了类型安全的特性,我们应对此心怀感激(看看JS吧)。尽量避免使用原始类型 (raw types)或者对象类型。泛型大多数情况下都提供了让你的代码在编译时类型安全的机制。
// DON'T
List movies = Lists.newArrayList();
movies.add("Hello!");
[...]
String movie = (<strong>String</strong>) movies.get(0);
// Do List
<<strong>String</strong>> movies = Lists.newArrayList();
movies.add("Hello!");
[...]
String movie = movies.get(0);
别忘了你能在函数的参数和返回值中使用泛型。