gpt4 book ai didi

java - 如果java匿名内部类采用不同的最终参数,如何重用它们?

转载 作者:行者123 更新时间:2023-12-01 08:15:35 26 4
gpt4 key购买 nike

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

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

一个简单的例子:

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

我需要同时为不同对象提供昂贵的ToBuild实例,例如1L、new Date()、“另一个类似的用例”

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

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

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

就我而言,此方法需要访问包含为其构建代理的序列化对象的 byte[]。因此,我必须创建一个新的 MethodHandler 并为每个我想要代理的对象构建/编译一个新的代理对象。

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

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

Lazy deserializationproxy for java

最佳答案

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

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

关于java - 如果java匿名内部类采用不同的最终参数,如何重用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13613659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com