gpt4 book ai didi

java - Spring:如何确保类仅由 spring 实例化,而不是通过关键字 new 实例化

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:36:40 24 4
gpt4 key购买 nike

是否可以保证 只有 spring 可以在编译时通过关键字new 来实例化一个类,不能? (为了避免意外实例化)

谢谢!

最佳答案

如果要在编译时检测,构造函数必须是非公开的。Private 可能太严格了(它使代码分析工具假定它永远不会被调用,甚至可能在某些 IDE 中引起警告),我会说默认值(无修饰符,包保护)是最好的。如果您想允许其他包中的子类(但如果不允许直接从该子类调用构造函数是不可能的),您可以将其保护起来。确保适本地注释构造函数,以便阅读代码的任何人都清楚为什么构造函数是这样的。

Spring 将毫无问题地调用此非公共(public)构造函数(自 Spring 1.1 起,SPR-174)。

这个问题是否不允许其他任何东西调用你的构造函数,强制类的每个用户使用 Spring 依赖注入(inject)的想法(所以这个问题的整个目标)是一个好主意还是一个整体不同的事情。

如果这是在库/框架中(通常与 Spring 一起使用),限制它的使用方式可能不是一个好主意。但是,如果它用于您知道只会在您的已关闭项目中使用的类,这已经强制使用 Spring,那么它可能确实有意义。

或者,如果您的真正目标只是避免有人创建实例而不使用其依赖项对其进行初始化的可能性,您可以只使用构造函数依赖注入(inject)。

如果您的目标只是防止构造函数的意外使用(开发人员不知道该类应该由 Spring 初始化),但不想完全限制可能性,您可以将其设为私有(private),但也可以添加静态工厂方法(使用显式名称,例如 createManuallyInitializedInstance 或类似名称)。

坏主意:另一种可能的替代方法是使构造函数公开可用,但弃用它。这样它仍然可以使用(无需像使用反射那样诉诸黑客)但任何意外使用都会发出警告。但这并不是真正的干净:这不是弃用的目的。

关于java - Spring:如何确保类仅由 spring 实例化,而不是通过关键字 new 实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2476472/

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