用REFLECTION打破SINGLETON模式的论点是否可行?

问题描述

我了解了通过枚举实现的SINGLETON,因此,它还保留了针对反射的单例性质。

是否存在实际的行业/实时场景,这种情况可能会发生?

我的理解不是。

当所有代码都放在我身边时,为什么我的代码中的任何单例类都会发生这种事情。

相反,这样的代码实践对那些有权访问代码存储库的人来说是可见的,因此它不会遗漏!

想了解一下,如果我错过了一些可以实际发生的观点!

解决方法

如果您询问是否有可能 以其他方式实现单例,则可以:

  • 您可以使用反射来访问私有字段
  • 您可以使用反射来更新最终字段。

实用吗?好吧,这取决于您的实际含义。

在实践中会发生吗?是的。

我们无法列举某人可能需要(或选择)做这种事情的原因。但是,假设您有一些紧迫的理由来更改单例的值,并且您丢失了所有源代码。 (是的,它发生了!)或者假设您一开始就没有源代码。

当所有代码都放在我身边时,为什么我的代码中的任何单例类都会发生这种事情。

如果您拥有源代码,并且拥有更改和重新编译源代码的自由,那么使用反射破坏单例将是一个坏主意。如果有必要(出于实用的原因)打破单例的不变式,那么最好修改API ,这样可以清楚地知道您在做什么以及为什么。

相反,这样的代码实践对那些有权访问代码存储库的人来说是可见的,因此它不会遗漏!

仅仅因为有人可以访问并不意味着他们会费心看。仅仅因为他们看起来并不意味着他们就会看到。 (有一些方法可以隐藏在应用程序代码库中可疑的代码。)


无论如何,关键是这种事情对于单例模式的某些版本(而不是其他版本)是可能的,并且如果情况允许或要求,可能发生的任何事情。 / p>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...