java - 这个添加到 Java 的东西会很难实现吗?

标签 java compiler-construction decorator

我经常希望能够正确地修饰 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 来编译它,它由 ListTestListPatch 组成。

Java 开发人员的座右铭一直是(并且可能永远是)“如有疑问,请忽略它。” 不过。

相关问题:

关于java - 这个添加到 Java 的东西会很难实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11713269/

相关文章:

python - @measured 是标准装饰器吗?它在哪个图书馆?

java - 我应该如何测试 JApplets 和 Applets?

c++ - C++ 编译器会消除赋值重复吗?

c - 执行数据部分中的一段代码

python - 将装饰器列表应用于可调用对象?

java - 抽象装饰器类而不是装饰器中的功能

java - 声明抛出异常的方法和该异常的子类

java - 找不到满足 java 要求的版本(来自版本 : ) No matching distribution found for java

java - 在 ActiveMQ 中看不到 AddLuceneWork 消息

c++ - C++ 编译器如何创建对象?