我目前正在从事一个项目,在该项目中我使用单例类来更改用户的 View 。此 DisplayManager(单例)具有 addView(View view)
和 replaceView(View view)
等方法。但它也有一个名为 displayRootView()
的方法,它只能被调用一次(在初始化期间)并且只能由一个类调用,即扩展 Application 类的 StartUp 类。
关于如何防止使用单例的其他类调用 displayRootView()
方法有什么想法吗?
我已经考虑过 StackTrace,但这似乎并不理想。我虽然可以通过在 StartUp 类上使用标记接口(interface)来将它与其余部分分开?
如有任何建议,我们将不胜感激。
最佳答案
呃,这很难阻止某些类调用您的方法,因为它违反了一些核心 OOP 原则。该方法不应该关心谁调用它。这是基本的关注点分离 - 您的方法应该明确约定其作用,而不是 JVM 当时的状态。
考虑这些问题:
- 如果子类化
StartUp
会发生什么?例如,将桌面、移动和 Web 平台分开? - 如何在不涉及
StartUp
的情况下对该方法进行单元测试? - 如果您在那里需要另一层抽象会怎样?
- 如果以及何时添加代理(通过 AOP 或 Spring 代理)怎么办?
- 如果您需要从
Timer
调用方法会怎样?它仍然会从StartUp
类源调用(并且是正确的),但它不会出现在堆栈跟踪中。
以及其他此类注意事项。
抛出某种异常(如 IllegalStateException
或自定义异常),以防第二次调用该方法是绝对有效的恕我直言。
这看起来您可能希望对您的代码进行静态检查,而不是代码内或运行时检查。我不认为将自定义规则添加到 Findbugz 或 PMD 以查找方法的所有直接调用并检查调用类(如果从其他地方调用则构建失败)不会非常困难。但我认为这样的检查实际上没有用。
最后,您需要在所述类之外合法使用该方法的可能性要大得多,而不是有人在收到警告并创建适当的 Javadoc 后意外错误地使用它。
关于Java(FX) - 只允许 1 个类从单例类调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28113690/