偏爱继承而不是继承
有充分的理由,“在继承中偏爱组成”这一口头禅在文献中已多次重复。 但是,Java很少或根本没有语言支持来简化对象的组成。 但是,有了名为“简洁方法机构”的新的JEP草案,情况可能会略有改善。
Brian Goetz负责JEP草案,该草案很可能将在项目“ Amber”下处理。 完整的草稿可以在这里找到。
简洁的方法体
JEP在实施时允许使用一种称为“简明方法体(CMB)”的方法,从广义上讲,方法主体可以是lambda或方法引用。 这是一个例子:
老式:
int length(String s) {
return s.length();
}
新的CMB:
int length(String s) -> s.length(); // -> is "single expression form"
或者简单地:
int length(String s) = String::length; // = is "method reference form"
这将减少样板代码,同时提高代码的可读性。
组成
考虑现有的Java类
Collections.UnmodifiableList
委托一个内部
List
类并防止对其进行修改(缩短代码并重新排序以提高可读性):
static class UnmodifiableList<E> extends UnmodifiableCollection<E>
implements List<E> {
final List<? extends E> list;
UnmodifiableList(List<? extends E> list) {
super(list);
this.list = list;
}
public boolean equals(Object o) {return o == this || list.equals(o);}
public int hashCode() {return list.hashCode();}
public E get(int index) {return list.get(index);}
public int indexOf(Object o) {return list.indexOf(o);}
public int lastIndexOf(Object o) {return list.lastIndexOf(o);}
public E set(int index, E element) {
throw new UnsupportedOperationException();
}
使用CMB,可以这样实现:
static class UnmodifiableList<E> extends UnmodifiableCollection<E>
implements List<E> {
final List<? extends E> list;
UnmodifiableList(List<? extends E> list) {
super(list);
this.list = list;
}
public boolean equals(Object o) = list::equals;
public int hashCode() = list::hashCode;
public E get(int index) = list::get;
public int indexOf(Object o) = list::indexOf;
public int lastIndexOf(Object o)= list::lastIndexOf;
public E set(int index, E element) {
throw new UnsupportedOperationException();
}
我认为此功能很有意义。 当委派具有一个或多个参数的方法时,此功能特别有用。
翻译自: https://www.javacodegeeks.com/2018/09/composition-in-java-jep-draft.html