如果返回值可能为null,那么使用Optional类型。 尽量不要把Optional做为接口参数,这会使得接口调用变得很笨拙。
public Optional<String> getComment() {
return Optional.ofNullable(comment);
}
不要使用数组做为返回值或者参数。
使用数组做为返回值时,为了防止调用者修改source数组,常常要先拷贝source数组再返回,效率不高(比如Enum::values()
)。
使用数组做为参数时,其它线程可能会同时在修改数组。
如果需要强调返回的集合是不可修改时,可以考虑使用Stream
做为返回类型。
public Stream<String> comments() {
return Stream.of(comments);
}
可以考虑增加静态的接口方法来创建接口的实现类。
相比Point point = new PointImpl(1,2);
而言,Point point = Point.of(1,2);
隐藏了具体的实现类。
考虑使用lambda,而不是继承,来个性化对象的行为。
//不要这样
Reader reader = new AbstractReader() {
@Override
public void handleError(IOException ioe) {
ioe. printStackTrace();
}
};
//better to expose a static method or a builder in the Reader interface that takes a Consumer<IOException> and applies it to an internal generic ReaderImpl
Reader reader = Reader.builder()
.withErrorHandler(IOException::printStackTrace)
.build();
给Functional Interface加上@FunctionalInterface
,保证接口只有一个抽象方法。
如果接口要求参数不为null
,考虑使用Objects.requireNonNull()
做参数验证,可以提前抛出异常。
不要过分考虑带来的性能损失,JVM会优化掉不必要的检查。
public void addToSegment(Segment segment, Point point) {
Objects.requireNonNull(segment); //可以更早地抛出异常
Objects.requireNonNull(point);
segment.add(point);
}
更多详见原文。