匿名内部类名 class 相同 - obj.getClass().getName()

ClassName of annonymous inner class is same - obj.getClass().getName()

我正在创建 20 个新的内部 classes 并覆盖了一个打印 class 名称的方法。但每次我得到这 20 个实例时,class 名称都是相同的。我的要求是为每个人获得不同的 class 名称。我怎样才能做到这一点?非常感谢任何指点 - 谢谢。

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class TestClassName {
    public static void main(String[] args) {


    List<? super Check>  list=   IntStream.rangeClosed(1, 20).mapToObj(e -> new Check() {

        @Override
        public void execute() {
            System.out.println(this.getClass().getName());

        }
    }).collect(Collectors.toList());

list.forEach(i -> ((Check)i).execute());
}
}

interface Check {
public abstract void execute();
}

输出

TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
TestClassName
    TestClassName

简单:您正在重复实例化 相同的 内部 class。

您的代码只包含一个内部 class!

当你执行 new Integer() 20 次时,你会假设每次都创建一个新的 Integer class 吗?当然不是。 class 保持不变,您只是得到相同 class.

的不同对象

为了创建多个匿名内部class,你实际上必须在源代码中重复添加定义!

要解决您的问题,您需要一个使用对象 "identity" 而不是它们的 class 的注册表!

您只是在创建同一个匿名 class 的新实例。在 运行 时间添加新的 classes 是非常困难的(或者可能是不可能的,这取决于安装了什么安全管理器)。而且这几乎肯定不是您需要做的。

从对您问题的评论来看,您似乎只需要区分接口的实例。为此,最简单的方法是在注册表中使用哈希映射。

大多数映射实现(如HashMap)依赖于所谓的值相等:如果equals() [,映射将两个引用视为同一对象=39=] true。在某些情况下(我不知道你是不是其中之一),这不是正确的语义,你需要对象标识(也就是说,只有当两个引用 == ).为此,您可以在注册表中使用 IdentityHashMap 而不是 HashMap。它使用 System.identityHashCode()== 来实现映射,而不使用对象的 equals()hashCode().

实现

在您的评论中,您表达了对客户是否正确实施 equals()hashcode() 的担忧。这让我觉得是借来的麻烦,但如果你想解决这个问题,IdentityHashMap 也可以在这里完成工作。或者,您可以将接口替换为实现 equals()hashCode() 的抽象基础 class 作为委托给其 Object 实现的 final 方法,但这似乎笨手笨脚,也许行不通。