我经常希望能够正确地修饰 java 类,即为它们添加行为。我知道来自 ruby 的 mixins,我知道它们会变得非常困惑。
我想出了这样一个语言结构的理论想法:
package org.test.decorator;
public decorator ListPatch<E> extends List<E> {
public E last() {
return this.get(this.size() - 1);
}
}
this
可以访问 List
的公共(public)成员和 Decorator 本身。
然后在类里面我可以使用:
package org.test.decorator;
decoration org.test.decorator.ListPatch;
public MyClass {
public void foo() {
List<String> list = Lists.newArrayList();
list.add("test");
System.out.println(list.last());
}
}
我对编译器了解不多,所以我想知道这样的事情是否可行。如果它真的会有所改进。
最佳答案
当然,这是可能的。
Scala 编译为字节码(并且具有从 Scala 类到字节码类的相当直接的映射)并支持混合的事实证明了这一点。
以下是您的示例代码在 Scala 语法中的样子:
class ListTest {
// ...
}
trait ListPatch {
def last {
// ...
}
}
object Main {
def main(args: Array[String]) {
val list = new ListTest() with ListPatch;
list.add("test")
println(list.last)
}
}
Scala 通过添加一个辅助类 Main$$anon$1
来编译它,它由 ListTest
和 ListPatch
组成。
Java 开发人员的座右铭一直是(并且可能永远是)“如有疑问,请忽略它。” 不过。
相关问题:
关于java - 这个添加到 Java 的东西会很难实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11713269/