【问题标题】:Correct approach to Properties正确处理属性的方法
【发布时间】:2010-09-20 00:24:24
【问题描述】:

我正在使用 Java 开发一个相当大的项目。我的问题是关于如何最好地为我的应用程序构建一组属性。

方法 1:拥有一些每个类都可以访问的静态 Properties 对象。 (缺点:那么,如果将某些类从应用程序的上下文中取出,它们就会失去通用性;它们还需要显式调用位于不同类中的某些静态对象,并且将来可能会消失;只是不会感觉对,我错了吗?)

方法 2:让属性由主类实例化并传递给其他应用程序类。 (缺点:您最终会将指向 Properties 对象的指针传递给几乎每个类,这似乎变得非常多余和麻烦;我不喜欢它。)

有什么建议吗?

【问题讨论】:

    标签: java oop properties structure


    【解决方案1】:

    我喜欢对许多属性使用 Spring 依赖注入。您可以将应用程序视为构建块,并将属性直接注入需要它们的组件中。这保留(鼓励)封装。然后,您将组件组装在一起并创建“主类”。

    依赖注入的一个很好的副作用是您的代码应该更容易测试。

    【讨论】:

    • 更可取,因为它根本不需要通用属性引用。它特定于课程的需求。
    【解决方案2】:

    实际上,方法 2 效果很好。

    我尝试在最近的项目中使用单例属性对象。然后,到了添加功能的时候,我需要修改Singleton,并且后悔不得不找到我使用MySingleton.getInstance()的每个地方。

    通过各种构造函数传递全局信息对象的方法 2 更易于控制。

    使用显式设置器也有帮助。

    class MyConfig extends Properties {...}
    
    class SomeClass {
        MyConfig theConfig;
        public void setConfi( MyConfig c ) {
            theConfig= c;
        }
        ...
    }
    

    它运行良好,您会很高兴您严格控制哪些类实际上需要配置信息。

    【讨论】:

    • 我认为 MyConfig 应该包含一个 Properties 对象而不是扩展它。但无论哪种方式都可以。
    • 方法 2 是要走的路。我可以建议使用Guice 来管理依赖关系。
    • 我看不出这样更好。如果您更改 MyConfig(就像您对单例所做的那样),您仍然会遇到相同的重构问题(当然取决于更改的内容),即在引用它的所有位置进行更改。
    • @Robin:如果您正在创建 MyConfig 的适当多态子类,则不会。然后除了 MyOtherConfig(MyConfig 的子类)的初始构造之外没有任何变化。
    【解决方案3】:

    如果很多类都需要这些属性,我会选择方法 1。或者可能是使用单例设计模式而不是所有静态方法的变体。这意味着您不必一直传递一些属性对象。另一方面,如果只有少数类需要这些属性,则出于您提到的原因,您可能会选择方法 2。您可能还想问自己,您编写的类实际上被重用的可能性有多大,如果是,那么重用属性对象有多大的问题。如果不可能重用,现在不要理会它,选择最适合当前情况的解决方案。

    【讨论】:

      【解决方案4】:

      听起来您需要一个配置管理器组件。它可以通过某种服务定位器找到,可以像ConfigurationManagerClass.instance() 一样简单。这将封装所有的乐趣。或者你可以使用像 Spring 这样的依赖注入框架。

      很大程度上取决于组件在您的架构中如何找到彼此。如果您的其他组件作为参考被传递,请执行此操作。只要保持一致。

      【讨论】:

        【解决方案5】:

        如果您正在寻找快速的东西,您可以使用系统属性,它们适用于所有类。您可以存储一个字符串值,或者如果您需要存储“东西”列表,您可以使用 System.Properties() 方法。这将返回一个“属性”对象,它是一个 HashTable。然后,您可以将所需的任何内容存储到表中。它并不漂亮,但它是拥有全局属性的快速方法。 YMMV

        【讨论】:

          【解决方案6】:

          我通常会选择一个位于公共项目中的单例对象,并包含一个以命名空间为键的自身哈希表,从而为每个对象生成一个属性类。

          依赖注入也是一个不错的方法。

          【讨论】:

            【解决方案7】:

            当我有一个指向内存中属性的静态指针时,我感觉更舒服。有时您想在运行时重新加载属性,或者使用静态引用更容易实现的其他功能。

            请记住,没有一个班级是一座孤岛。一个可重用的类可以有一个客户端类来保持内核不受单调引用的影响。

            你也可以使用接口,只是尽量不要过度。

            【讨论】:

              【解决方案8】:

              方法 2 显然更好。

              无论如何,你不应该让其他类搜索配置对象。您应该在对象外部的配置对象中注入配置。

              查看apache commons configuration 以获得有关配置Impl 的帮助。

              所以在 main() 中你可以有

              MyObject mobj = new MyObject();
              mobj.setLookupDelay(appConfig.getMyObjectLookupDelay);
              mobj.setTrackerName(appConfig.getMyObjectTrackerName);
              

              代替

              MyObject mobj = new MyObject();
              mobj.setConfig(appConfig);
              

              其中 appConfig 是 apache 配置库的一个包装器,它根据配置文件中值的名称执行所有值的查找。

              这样你的对象就变得很容易测试了。

              【讨论】:

                【解决方案9】:

                有一段时间没做Java了,你就不能把你的属性放到java.lang.System属性中吗?这样您就可以从任何地方访问这些值,并避免使用“全局”属性类。

                【讨论】:

                  猜你喜欢
                  • 2020-11-22
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-12-08
                  • 2011-02-28
                  • 2016-01-15
                  • 1970-01-01
                  • 2016-05-02
                  相关资源
                  最近更新 更多