存储和访问Java应用程序数据的最佳方法

利亚姆·瑞安(LiamRyan)

我处于一个庞大的重构项目的中间,该代码有一个5000行的主类,该主类被注入到所有内容中,存储了所有内容并具有所有通用代码。

我不是分析和设计方面的专家,但是我已尽我所能将事情分开,并且通过重构依赖于主类的类来使用我创建的新类,我占了80%左右。

在应用程序启动时会初始化某些类型的数据,并且在应用程序的整个生命周期中几乎所有内容都可以访问这些数据。例如,有一个Config类,其中包含数百个参数。

我采用的方法是创建几个单例,两个最主要的单元是GUIData和ClientData。GUIData包含对应用程序大型机的引用,而clientdata保留对config和其他类似类的引用。

这使我可以从代码中的任何地方调用ClientData.getInstance()。getConfig()。getParam(“ param”),但我不认为这是最好的方法。

我考虑了单个静态类,而不是这些包含类实例的数据单例,但是某些类确实需要构造函数。

我一直在反复搜索一个星期,试图找到一种更好的方法来做到这一点,但总而言之,我总是以谈论数据库缓存的线程告终

范·欧克尔

不变的(配置)实例提供“线程安全的应用程序范围的数据访问”。Typesafe的配置(如Brian Kent在评论中所建议)确实做到了这一点。请注意,这不涉及静态类或单例。静态类和单例现在可能会满足您的目的,但将来可能会令人烦恼。它们可能很方便,但是请尝试限制其使用。

在读取和解析配置数据之后,必须进行初始化。它通常在启动其他处理线程之前在应用程序启动时完成。初始化将必须尽可能多地验证配置数据,以便快速失败并在配置数据不好的情况下终止程序。

将大量配置数据捆绑在一起可以创建“隐藏的通信线路”。例如,您更新一个值而应用程序失败,因为它也需要更新其他值。将所有配置数据放在一个文件中并从该文件中加载是完全可以的,但是您的应用程序(具有数百个配置选项)应将配置数据分为一组,以供应用程序的不同部分使用。这样可以提高隔离度,帮助进行单元测试,并使得将来更改应用程序成为可能,而不会引起太多令人讨厌的惊喜。

有两种使用一组配置数据的方法:

  1. 从一个对象内部调用单例Settings.getInstance().getConfigForThisModule()
  2. 通过构造函数或通过提供使用配置数据的每个对象以及配置数据setConfig(ConfigForThisModule config)

第一种方法取决于不调用的约定,Settings.getInstance().getConfigForACompletelyUnrelatedModule()这可能是一个缺点。第二种方法更符合“依赖注入”,并且可能是将来的证明。您可以在重构时混合使用这两种方法,只需确保它们是一致的即可(例如,仅对应用程序所有部分中使用的配置数据使用单例方法)。

为了进一步改善使用配置数据的设计,请牢记以下(可能)将来的功能要求:更新配置文件时,将重新加载配置数据并在应用程序中使用。大多数日志记录框架设法支持此功能要求,而不会影响多线程应用程序的性能。除其他事项外,它还需要以下应用程序:

  • 如果新的配置数据不好,则不会终止程序,但会记录错误,并且旧的配置数据仍在使用中。您的初始化过程将需要处理“重新启动时加载”和“重新加载”方案。要避免的主要问题是初始化过程需要可重复使用,并且不应影响应用程序的其他(运行)部分(再次是隔离)。
  • 寿命长的对象可能不保留配置数据的本地副本或对的实例的引用ConfigForThisModule,而应Settings.getInstance()...(或可以返回更新后的实例的某些其他方法)进行定期调用。
  • 用新配置替换旧配置可能不会导致错误。从技术上讲,替换配置就像AtomicReference用返回的新配置实例更新一样简单Settings.getInstance()...但这也是测试配置数据集隔离性的地方:在一个模块中同时使用旧集和在另一个模块中同时使用新集应该没有问题。

配置数据可以看作是一种“全局状态”。考虑到这一点,在以下两个问题中讨论了关于做什么和避免什么的进一步设计要点(部分公然复制到此答案):

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

存储iOS应用程序数据的最佳方法?

存储应用程序数据并将其加载到应用程序中的最佳方法是什么?

Android中的Qt和应用程序数据存储

基本的Java应用程序数据存储

在IndexedDB和File System之间本地存储chrome应用程序数据的最佳选择是什么?

在Xamarin.Forms中存储应用程序数据的最佳Environment.SpecialFolder是什么?

OS X应用程序。哪种存储数据的最佳方法?

在Java中的电子表格应用程序中存储数据的最佳方法

存储Java应用程序名称和版本属性的最佳方法

在本地存储 PC 应用程序数据并与服务器数据库同步的最佳方式

洋葱架构访问目录和应用程序数据库

应用程序数据存储在哪里?

在IOS中存储应用程序数据的正确位置

在Twitter上存储应用程序数据

在哪里存储应用程序数据?

访问特定于平台的应用程序数据区域

使用XCode访问应用程序数据

在Java应用程序中打开和返回数据库连接的最佳方法?

在Java应用程序中保存数据的最佳方法?

正确加密应用程序数据的方法

RDF /三重存储是否适合存储应用程序数据?(与图元数据相对)

在Node.Js / Express应用程序中存储数据库配置的最佳方法

存储Web应用程序临时数据的最佳实践

在多线程应用程序Android中访问数据库的最佳方法?

从Web应用程序访问数据库的最佳实践

下载初始应用程序数据

在应用程序中存储机密的最佳方法

在使用 Angularjs 和 Electron 构建的应用程序中将数据存储在本地数据库中的最佳方式

应用程序数据安全性-不想让用户访问我的Android应用程序文件