【问题标题】:Global Access in JavaJava 中的全局访问
【发布时间】:2011-02-01 19:30:33
【问题描述】:

在 Java 中,没有像 C++ 那样的全局访问。那么,如果他们想创建一个可以从任何类访问的对象容器,他们会怎么做呢?或者说一个包含全局值的 java bean。

例如,如果我正在制作电梯模拟器,那么像int numElevators 这样的所有人都需要知道的字段必须放在某个地方对吗?与电梯的集合对象 Elevators[] elevators 相同。

我可以想到一种方法,即创建一个单例类来存储所有这些全局变量。然后使用静态方法提供来自任何类的访问。但是有没有更优雅的解决方案?

【问题讨论】:

  • 通常,一个非常优雅的解决方案是不使用全局变量或等效的东西;)
  • 电梯应该是在一栋楼里吧?一个建筑类是有意义的。

标签: java design-patterns singleton global-variables


【解决方案1】:

我希望Building 的实例拥有Elevators 的集合。我认为项目中很少有真正全球化的东西,你通常可以找到一些管理实体来包含和分发这些知识。

通过在这样的实体中绑定它,您可以 a) 更轻松地控制访问和更改/重构 b) 模拟它并使测试更容易。

【讨论】:

  • 这绝对是正确的方法。 99% 的情况下,你想使用 Singleton 的东西实际上可以与一个对象相关联。一个更困难的例子是你想要运行模拟的步骤数——但这可以通过一个“模拟”对象来处理。
  • 我喜欢管理实体的想法,同时也传播知识。那么一个好的设计会是一个包含电梯的单例类,以及一个引用该单例构建对象的电梯管理器类吗?
  • 我希望有一个 ElevatorManager instance,并且只提供给需要了解它的类。如果这看起来是一个巨大的数字,那么它通常表明您的建模不太正确。
【解决方案2】:

我可以想到一种方法,即创建一个单例类来存储所有这些全局变量。然后使用静态方法提供来自任何类的访问。但是有没有更优雅的解决方案?

不,就是这样。静态方法和单例的组合。

【讨论】:

  • 我有一个单独的 Building 类,但总是调用 Building.getElevators() 似乎不优雅。
  • 为什么?当您考虑它时,您正在为您正在使用的建筑物安装电梯。名称是描述性的。
【解决方案3】:

您可以创建一个具有所需字段的非单例类,并为任何需要它的对象提供此实例。

尽量减少假定单个此类上下文的代码量,以便以后更容易适应多个上下文。

例如,您可能从一套电梯开始,但后来需要多套,用于不同的塔楼或建筑物。

【讨论】:

    【解决方案4】:

    您可以创建一个包含大量公共静态字段的类。类似的东西

    class AppGlobals {
       public static final String IMPORTANT_STUFF = "something global...";
       ....
    
    }
    

    或者你可以读入一个属性配置来获取简单的数据,比如字符串等等。

    您也可以将 1 和 2 结合起来。

    编辑 -- 对于您的电梯/建筑物示例,正确的 OO 设计将消除对全局变量的需求......

    【讨论】:

      【解决方案5】:

      如果您回避 Singleton,您可能想研究 Monostate Design Paradigm。这是一个很好的 StackOverflow 问题。

      Monostate vs. Singleton

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-15
        • 2014-11-11
        • 1970-01-01
        相关资源
        最近更新 更多