5

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

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

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

有什么建议么?

4

9 回答 9

7

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

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

于 2008-10-30T15:23:36.387 回答
2

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

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

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

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

class MyConfig extends Properties {...}

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

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

于 2008-10-30T15:27:19.407 回答
2

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

于 2008-10-30T15:27:55.537 回答
1

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

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

于 2008-10-30T15:25:06.697 回答
1

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

于 2008-10-30T18:49:32.773 回答
0

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

依赖注入也是一种很好的方法。

于 2008-10-30T15:26:31.967 回答
0

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

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

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

于 2008-10-30T16:01:45.763 回答
0

方法 2 显然更好。

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

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

所以在 main() 你可以有

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

代替

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

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

这样,您的对象变得非常容易测试。

于 2008-10-30T16:25:25.887 回答
0

好久没做Java了,就不能直接把你的属性放到java.lang.System属性里面吗?通过这种方式,您可以从任何地方访问值并避免拥有“全局”属性类。

于 2008-10-30T18:54:41.360 回答