全局对象的成员变量是否也应该是全局的?

时间:2010-12-26 04:37:46

标签: java eclipse plugins singleton global

我正在开发Eclipse中的插件,它要求为Plugin类使用单例模式以访问运行时插件。该类保存对诸如Configuration和Resources之类的对象的引用。

  

在Eclipse 3.0插件运行时对象中   不是全球管理的,所以也是如此   通常无法访问。相反,   每个插件都可以自由声明API   这暴露了插件运行时   对象(例如,MyPlugin.getInstance()

为了让我的系统的其他组件访问这些对象,我必须执行以下操作:

MyPlugin.getInstance().getConfig().getValue(MyPlugin.CONFIGKEY_SOMEPARAMETER);

,这是过于冗长的IMO。

由于MyPlugin提供了全局访问权限,因此我不仅可以更轻松地提供对其管理的对象的全局访问权限吗?

MyConfig.getValue(MyPlugin.CONFIGKEY_SOMEPARAMETER);

有什么想法吗?

(我实际上是因为我正在阅读整篇文章“全球变量访问和单身人士是邪恶的”辩论)

2 个答案:

答案 0 :(得分:1)

  

有什么想法吗?

是的,对于您正在检查的当前用例,您可以使用静态来略微简化示例代码。

但想想使用静力学的潜在缺点:

  • 如果在未来版本的Eclipse插件对象 全局管理?
  • ,该怎么办?
  • 如果要在相关插件中重用配置类,该怎么办?
  • 如果您想使用配置类的模拟版本进行单元测试,该怎么办?

此外,您可以通过重构使代码更简洁; e.g。

... = MyPlugin.getInstance().getConfig().getValue(MyPlugin.CONFIGKEY_P1);
... = MyPlugin.getInstance().getConfig().getValue(MyPlugin.CONFIGKEY_P2);

变为

MyConfig config = MyPlugin.getInstance().getConfig();
... = config.getValue(MyPlugin.CONFIGKEY_P1);
... = config.getValue(MyPlugin.CONFIGKEY_P2);

答案 1 :(得分:0)

你建议

MyPlugin.getInstance().getConfig().getValue(MyPlugin.CONFIGKEY_SOMEPARAMETER);

太冗长了

MyConfig.getValue(MyPlugin.CONFIGKEY_SOMEPARAMETER);

可能会更好。按照这个逻辑,不会:

getMyConfigValue(MyPlugin.CONFIGKEY_SOMEPARAMETER):

更好(也许不短,但更简单)?我建议你写一个本地帮手方法。

这为您提供了可读性的优势,而不会绕过那些通过简单/简单/简单方式修复代码的人所制定的概念。

一般来说全局变量在任何情况下都很糟糕。单身人士也是一个不起眼的概念,但他们在一堂课中打破了公共静默的地狱。

考虑如何模拟这样的课程。嘲弄公共静态是非常令人讨厌的。嘲弄单身人士很难(你必须在每个使用它的方法中覆盖你的吸气剂)。依赖注入是下一个层次,但它可以是DI和一些简单单例之间的触摸调用。