gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:18:57 24 4
gpt4 key购买 nike

我正在进行一个大规模的重构项目,代码有一个 5000 行的主类,它被注入(inject)到所有内容中,存储了所有内容并拥有所有公共(public)代码。

我不是分析和设计方面的专家,但我已尽我所能将事物分离出来,我大约 80% 是通过重构依赖于主类的类来使用我创建的新类。

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

我采用的方法是创建几个单例,其中两个最重要的是 GUIData 和 ClientData。 GUIData 包含对应用程序主机的引用,clientdata 维护对配置和其他类似类的引用。

这允许我从代码中的任何位置调用 ClientData.getInstance().getConfig().getParam("param") 但我不觉得这是最好的方法。

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

我一直在谷歌上搜索一个星期,试图找到一种更好的方法来做到这一点,但不知何故,我总是在谈论数据库缓存的线程上结束

最佳答案

不可变(配置)实例提供“线程安全的应用程序范围的数据访问”。
Typesafe config (正如布赖恩肯特在评论中所建议的那样)正是这样做的。
请注意,这不涉及静态类或单例。静态类和单例现在可以满足您的目的,
但它们在 future 可能会很麻烦。它们当然很方便,但请尝试限制它们的使用。

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

将大量配置数据捆绑在一起可以创建“隐藏的通信线路”。例如。您更新一个值,应用程序失败,因为它也需要更新其他值。将所有配置数据放在一个文件中并从那里加载它是完全没问题的,但是您的应用程序(具有数百个配置选项)应该将配置数据划分为由应用程序的不同部分使用的集合。这提高了隔离性,有助于单元测试,并使将来更改应用程序成为可能,而不会出现太多令人讨厌的意外。

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

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

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

    为了进一步改进使用配置数据的设计,请记住以下(可能的) future 功能需求:当配置文件更新时,配置数据会重新加载并在应用程序中使用。大多数日志框架都设法支持此功能需求,而不会影响多线程应用程序的性能。除其他外,它需要您的应用程序的以下内容:
  • 如果新的配置数据不好,程序不会终止,而是记录一个错误,旧的配置数据继续使用。您的初始化过程将需要处理“重新启动时加载”和“重新加载”两种情况。最重要的是,您的初始化过程需要可重用,并且不应影响应用程序的其他(运行)部分(再次隔离)。
  • 长期存在的对象可能不会保留配置数据的本地副本或对 ConfigForThisModule 实例的引用。 , 而是 Settings.getInstance()... (或其他一些可以返回更新实例的方法)应该定期调用。
  • 用新配置替换旧配置可能不会导致错误。从技术上讲,更换配置就像更新 AtomicReference 一样简单。带有 Settings.getInstance()... 返回的新配置实例.但这也是测试配置数据集隔离的地方:在一个模块中使用旧集和在另一个模块中同时使用新集应该没有问题。

  • 配置数据可以看作是一种“全局状态”。考虑到这一点,在以下两个问题中讨论了关于做什么和避免什么的进一步设计点(部分公然复制到这个答案):
  • Why is Global State so Evil?
  • How are globals any different from a database?
  • 关于java - 存储和访问 Java 应用程序数据的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37362963/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com