gpt4 book ai didi

java - 类的实例是不可变的吗?

转载 作者:行者123 更新时间:2023-11-29 08:26:47 25 4
gpt4 key购买 nike

我想知道是否Class实例是不可变的。声明的方法名称并不表明调用它们时实例状态会发生变化,但我在 javadoc 上没有找到明确的保证。

场景:我需要在 Set 中存储唯一的类名。理想情况下,我想用 Class 实例填充集合,以避免不必要地调用 Class.forName()当我需要通过反射访问类时。但是,最好使用不可变对象(immutable对象)作为集合的键。因此我想知道我是否可以立即使用 Class 实例。

最佳答案

首先,泛型部分 Class<?>在这里真的没关系。当然,没有原始类型,所以 Class<?>比 Class 好,但对于你的问题,通配符并不重要。

所以本质上,您是在询问 Class 对象是否不可变。出于所有实际目的,它们是。

当类加载器加载一个类时,类对象就会存在,并且它们会保持原样,除非整个类加载器以及它加载的所有内容都被卸载。

当这样的类对象仍在 map 中的某个地方使用时,就不会发生这种情况。

另一方面:Class.forName()对于已经加载的类来说不应该太贵。当序列化等事情发挥作用时,人们建议使用 String 而不是 Class 对象(例如,请参阅 here)。

必须区分类对象的不可变身份 和属于该类的实际“代码”。该代码可以在运行时更改(通过检测,想想代码的热交换)。但是类名,它的每个代码,和equals()平等不应受此影响。因为“身份”保持不变。

最后的说明:正如下面有趣的评论所示,有一些方法可以在一定程度上改变类对象。但所有这些 Activity 绝对是“不合常理”的。因此:理论上,您可能更喜欢 String 而不是 Class 对象,但实际上,在“正常”应用程序中,使用 Class 也应该可以正常工作。

关于java - 类的实例是不可变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52082133/

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