【发布时间】:2018-07-22 07:50:29
【问题描述】:
我正在创建 20 个新的内部类并重写了一个打印类名的方法。但是每次我得到这 20 个实例时,类名都是相同的。我的要求是为每个人获取不同的类名。我怎样才能做到这一点?任何指针都非常感谢 - 谢谢。
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$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
TestClassName$2
【问题讨论】:
-
您只是在创建同一个匿名类的新实例。您不能在运行时创建新的类名(至少不容易)。您对此有什么想法?你想完成什么?
-
我有一个向外部客户端公开的注册服务,可以为某些节点类型多次注册他们的服务,因此客户端可以创建尽可能多的对象,并且可以一次又一次地注册相同的节点类型.我想通过过滤它们的类名来避免执行相同的对象。
-
某种类型的所有对象都将具有相同的类名。您可能需要一些(唯一的)标识符来识别每个注册。
-
为什么不直接使用
==来测试对象身份呢?或者,如果您想使用equals()来区分对象,请为注册表使用某种基于散列的集合类型。 (请注意,equals()与==相同,除非您的对象覆盖了默认行为。) -
我认为将设计基于基本 Object 方法的正确实现是合理的。这是使用许多 Java 集合的要求。
标签: java lambda foreach java-8 inner-classes