0

我需要创建构建成本高且需要访问其中的最终变量的匿名内部类型。问题是我需要创建其中的许多,唯一的区别是使用的最终变量不同(对象本身和类型)。

是否有可能以更可重用的方式做到这一点?

一个简单的例子:

final Object aNeededParameter = "test";
Object expensiveToBuild = new ExpensiveInnerType() {
    public void doSomething() {
         aNeededParameter.toString();
    }
});

我需要同时为不同对象创建昂贵的构建实例,例如 1L、新日期()、“另一个类似的用例”

基本思想是在运行时为具体类的不同序列化实例创建代理,在第一次使用时反序列化这些对象。我做了一个工作示例(底部的链接),但代理创建非常昂贵。

有一个 ProxyFactory 需要一个 MethodHandler 来通过字节码增强创建一个 Proxy 对象。MethodHandler 定义了一个方法

invoke(Object self, Method realMethod, Method proxyMethod, Object[] args) throws Throwable

在我的情况下,此方法需要访问包含构建代理的序列化对象的 byte[]。所以我必须创建一个新的 MethodHandler 并为我想要代理的每个对象构建/编译一个新的代理对象。

调用方法在原始对象的每个方法调用之前自动调用,并简单地检查该对象是否已初始化,如果没有则反序列化它。之后,它调用原始对象上的被调用方法。

如果您想查看具体的用例,请看这里:

java的延迟反序列化代理

4

3 回答 3

4

只是不要让它匿名。匿名类的意义在于您不希望重用它们。通过构造函数将必要的最终变量传递给类。

doSomething如果您希望匿名类被实例化一次,其他选项是允许使用参数而不是构造函数。您仍然需要使其不是匿名的,并且它需要由父类拥有,但这允许您只使用一个对象。这是否是好的设计取决于具体情况。

于 2012-11-28T20:19:03.837 回答
1

使对象成为匿名内部类引用更改的对象的某个包装类的实例(例如,包装类的实例变量之一是对象类型,只需根据需要更改该变量)。

于 2012-11-28T20:22:44.110 回答
1

你的意思是

final Object[] param = { null };

Foo foo = new Foo() 
    void invoke() 
        use param[0]

param[0] = objA;
foo.invoke();

param[0] = objB;
foo.invoke();
于 2012-11-28T20:23:25.980 回答