【问题标题】:How to identify an instance of a class for uniqueness如何识别类的实例的唯一性
【发布时间】:2015-02-27 22:27:02
【问题描述】:

我有一个在 Android 可穿戴设备上运行的类,它应该只有一个实例,但是我偶尔会观察到一些意想不到的行为,这让我推测在某些情况下是否可能有两个实例正在创建中。

如果我在 C 或 C++ 世界中,我只需将日志语句添加到类的方法中以记录对象自身的内存地址,并且可以直接检查是否实际上存在两个对象或只有一个对象。

能够识别特定对象实例的 Java/Android 等效方法是什么?

【问题讨论】:

  • @Blackbelt:不,这根本不是我们想要的。
  • 您可以使用单例模式来防止多个实例运行。如果还是坚持跟踪对象,可以在构造函数中hash当前时间毫秒。
  • 如果您的类没有覆盖hashCode()(听起来没有理由这样做),那么您可以合理地期望该方法为不同的实例返回不同的值。
  • 如果它确实覆盖了hashCodestackoverflow.com/a/909861/1864688
  • 还要注意,单例模式不能 100% 有效地防止多个实例。一方面,您可以使用标准的 Singleton 实现,每个 ClassLoader 最多拥有一个实例,另一方面,在某些情况下,您可以通过序列化获得多个实例。

标签: java android


【解决方案1】:

toString() 的默认实现应该可以解决问题。根据java docs,它返回getClass().getName() + '@' + Integer.toHexString(hashCode()),并且hashCode() 对实例应该是唯一的,除非以不被覆盖的方式覆盖。根据java docs,似乎hashCode() 的默认实现使用对象的内存地址,提供类似于您在C 或C++ 中提到的功能。

如果hashCode() 已被覆盖,您可以使用System.identityHashCode(Object),它返回唯一的哈希码,无论hashCode() 是否已被覆盖。更多信息here.

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2020-04-02
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多