2008-10-30 153 views
5

我在一个相当大的项目在Java的工作。我的问题是关于如何最好地为我的应用程序构造一组属性。正确的方法属性

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

方法2:让属性由主类实例化并传递给其他应用程序类。 (缺点:你最终会传递一个指向Properties对象的指针到几乎每一个类,它似乎变得非常冗余和繁琐;我不会就像吧。)

有什么建议吗?

回答

7

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

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

+0

更好,因为它根本不需要通用的属性引用。这是特定于类的需求。 – Robin 2008-10-30 16:20:13

1

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

很大程度上取决于组件在架构中如何找到彼此。如果您的其他组件正在作为参考传递,请这样做。只要一致。

0

我通常会选择一个单独的对象,它驻留在一个公共项目中,并且包含一个在命名空间上键入的散列表,从而为每个对象生成一个属性类。

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

2

实际上,方法2工作得很好。

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

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

使用明确的setter也有帮助。

class MyConfig extends Properties {...} 

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

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

+0

我认为MyConfig应该包含一个Properties对象而不是扩展它。但它会以任何方式工作。 – ScArcher2 2008-10-30 15:47:47

2

如果这些属性需要很多类,我会选择方法1.或者可能使用Singleton设计模式的变体,而不是所有静态方法。这意味着你不必传递一些属性对象。另一方面,如果只有几个班级需要这些属性,您可以选择方法2,因为您提到的原因。您可能还想问问自己,您写的类实际上是否会被重用,并且如果有的话,重用属性对象有多大的问题。如果不太可能重复使用,现在不要为此而烦恼,并选择最适合当前情况的解决方案。

0

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

只记得没有班级是岛屿。一个可重用的类可以有一个客户类来保持核心免于单数引用。

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

0

方法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的配置库,做价值基础的所有查找在周围的包装配置文件中的值的名称。

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

1

如果您正在寻找快速的东西,您可以使用系统属性,它们可用于所有类。你可以存储一个String值,或者如果你需要存储一个'stuff'列表,你可以使用System.Properties()方法。这会返回一个HashTable属性对象。然后,您可以将任何想要的东西存储在表格中。这不太好,但它是拥有全球性质的快捷方式。 YMMV

0

有一段时间没有完成Java,但是你不能只把你的属性放到java.lang.System属性中吗?通过这种方式,您可以访问各处的值,避免出现“全局”属性类。

相关问题