gpt4 book ai didi

java - 访问匿名内部类变量

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:04 25 4
gpt4 key购买 nike

如何从外部类访问 i?

  HashSet<Integer> hs=new HashSet<Integer>(){
int i=30;
};

我可以这样做

int k=new HashSet<Integer>(){
int i=30;
}.i;

但是如果我得到'i'那么我就不能得到哈希集的实例。有没有办法同时获得?这个问题只是出于好奇。它没有太多实际应用。我只是想知道它是否可以做到。

最佳答案

方案一:对象注册系统

呈现的两个片段实质上是在存储对刚刚创建的匿名类实例的引用或立即访问其自定义字段之间做出选择。做一个似乎会丧失做另一个的能力。

达成妥协的一种方法是拥有一个对象注册系统,并在您的匿名类中使用实例初始化程序 ( JLS 8.6 ) 以自行注册到该系统。

这是一个简单的概念验证,使用 Object[] 作为一个简单的注册系统:

    final Object[] registrar = { null };
int k = new HashSet<Integer>(){
{ registrar[0] = this; }
int i= 666;
}.i;
Set<Integer> set = (Set<Integer>) registrar[0];

System.out.println(k); // 666
System.out.println(set.getClass().isAnonymousClass()); // true

本质上,我们使用一个 1 元素 Object[],并且在我们的匿名类的实例初始值设定项中,我们将 this“注册”到这个数组。请注意,这只是一个概念验证;在生产代码中,您会使用比这更健壮和类型安全的对象注册系统。


解决方案 2:元组

如果您的匿名类可能有多个“字段”,这种方法很有效。只需将它们全部打包成一个 tuple ,确保在匿名类中包含对 this 的引用。

这是一个简单的概念验证,使用 Object[] 作为元组:

    Object[] tuple = new HashSet<Integer>(){
Object[] tuple = { this, 666, 13, "XXX", "OMG ABUZE" };
}.tuple;
Set<Integer> set = (Set<Integer>) tuple[0];
set.add(null);
System.out.println(set.getClass().isAnonymousClass()); // true
System.out.println(Arrays.toString(tuple));
// [[null], 666, 13, XXX, OMG ABUZE]

在生产代码中,您将使用更面向对象和类型安全的 CustomTuple 类。请注意,这是“我的方法如何返回 2 个值”问题的类似解决方案:只需返回 1 个捕获所有这些信息的值。

关于java - 访问匿名内部类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3509801/

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