Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正确对待财产_Java_Oop_Properties_Structure - Fatal编程技术网

Java 正确对待财产

Java 正确对待财产,java,oop,properties,structure,Java,Oop,Properties,Structure,我在Java从事一个相当大的项目。我的问题是如何为我的应用程序最好地构造属性集 方法1:拥有一些每个类都可以访问的静态属性对象。(缺点:如果将某些类从应用程序的上下文中删除,它们将失去通用性;它们还需要显式调用位于不同类中的某个静态对象,这些静态对象将来可能会消失;这感觉不对,我错了吗?) 方法2:让属性由主类实例化并传递给其他应用程序类。(缺点:您最终将指向Properties对象的指针传递给几乎每个类,这似乎变得非常冗余和麻烦;我不喜欢这样。) 有什么建议吗?我喜欢对许多属性使用Spring

我在Java从事一个相当大的项目。我的问题是如何为我的应用程序最好地构造属性集

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

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


有什么建议吗?

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


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

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


这在很大程度上取决于组件在体系结构中如何找到彼此。如果其他组件作为引用传递,请执行此操作。保持一致

我通常选择一个单例对象,它位于一个公共项目中,并且包含一个在名称空间上键入的哈希表,从而为每个项目生成一个properties类


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

实际上,方法2非常有效

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

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

使用显式setter也有帮助

class MyConfig extends Properties {...}

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

它工作得很好,您会很高兴能够精确地控制哪些类实际上需要配置信息。

如果很多类都需要这些属性,我会选择方法1。或者可能是一种变体,其中使用单例设计模式而不是所有静态方法。这意味着您不必一直传递对象的某些属性。另一方面,如果只有少数类需要这些属性,出于您提到的原因,您可以选择方法2。您可能还想问问自己,您编写的类实际被重用的可能性有多大,如果是这样的话,同时重用properties对象的问题有多大。如果重用不太可能,现在就不要麻烦了,选择最简单的解决方案

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

只要记住,没有一门课是孤岛。一个可重用类可以有一个客户机类来保持核心没有单音引用


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

Approache 2在防守上更好

无论如何,您不应该让其他类通过配置对象进行搜索。您应该在对象之外的config对象中输入config

有关配置Impl的帮助,请参阅

所以大体上你可以

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

MyObject mobj = new MyObject();
mobj.setConfig(appConfig);
其中appConfig是apache配置库的包装器,它根据配置文件中的值名执行所有值的查找


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

如果您正在寻找可以快速使用系统属性的东西,那么所有类都可以使用它们。您可以存储字符串值,或者如果需要存储“stuff”列表,可以使用System.Properties()方法。这将返回一个“Properties”对象,它是一个哈希表。然后,您可以随时将所需内容存储到表中。这并不漂亮,但它是一种快速获得全局属性的方法。YMMV已经有一段时间没有使用Java了,但是您不能将您的属性放入Java.lang.System属性中吗?通过这种方式,您可以从任何地方访问值,并避免使用“全局”属性类。

我认为MyConfig应该包含属性对象,而不是扩展它。但这两种方法都是可行的。方法2是可行的。我可以建议你用它来管理依赖关系吗?我不认为这样更好。如果更改MyConfig(就像您更改singleton一样),您仍然会遇到同样的重构问题(当然取决于更改的内容),即在引用它的所有位置进行更改。@Robin:如果您正在创建MyConfig的正确多态子类,则不会。然后除了MyOtherConfig的子类MyOtherConfig的初始构造之外没有任何变化。更可取的是,它根本不需要泛型属性引用。这是特定于课程需要的。