偏爱继承而不是继承
有充分的理由,“在继承中偏爱组成”这一口头禅在文献中已多次重复。 但是,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