gpt4 book ai didi

java - Singleton Util 类的替代方案

转载 作者:行者123 更新时间:2023-12-02 05:37:30 24 4
gpt4 key购买 nike

所以我有一个像这样的类(class):

public class HBaseUtil {
private final String fileName = "hbase.properties";
private Configuration config;

private HBaseUtil() {
try {
config = new PropertiesConfiguration(fileName);
} catch (ConfigurationException e) {
// some exception handling logging
}
}

// now some getters pulling data out of the config object

public static String getProperty(String fieldKeyName) {...}

public static String getColumnFamily(String fieldName) {...}

// ... some more getters

// NO setters (thus making this a read-only class)
}

因此,基本上我自己有一个 Singleton 类,第一次使用它时,会设置一个配置对象,然后简单地继续监听 get 调用。这个类有很多问题:

  1. 由于 Singleton 和配置文件之间的紧密耦合,对 HBaseUtil 类中的静态方法进行单元测试变得很困难。
  2. 我真正想要的是能够向类提供文件名/文件名+路径,以便它可以进入该类,从该文件读取配置属性并将它们提供给传入的读取请求。但这里有一个重要的注意事项:我需要这种灵 active ,每次 JVM 启动时只指定一次属性文件。所以我当然不需要维护状态。

这是我能想到的:我有一个普通的类,它包含所有静态方法并且没有定义显式构造函数,而不是单例。

public class HBaseUtil {
// directly start with getters
public static String getProperty(Configuration config, String fieldKeyName) {...}

public static String getColumnFamily(Configuration config, String fieldKeyName) {...}

// ...and so on
}

然后,不要像这样在我的其他代码中使用该类:

HBaseUtil.getProperty(String fieldKeyName)

我会像这样使用它:

Configuration externalConfig = new PropertiesConfiguration("my-custom-hbase.properties");

HbaseUtil.getProperty(externalConfig, fieldKeyName)

我的问题:

  1. 我的思考方向正确吗?我的要求是每个 JVM 只能在类中具有一次灵 active 。为此,我的项目中需要配置的就是 HBase .properties 文件的位置/内容。我认为单例对于这个要求来说有点过分了。
  2. 还有哪些其他更好的方法可以满足我的要求(如上所述)?

谢谢!

注意:我已阅读this StackOverflow 讨论,但现在它让我更加困惑。

最佳答案

您应该避免所有静态方法,而是设计一个不强制其生命周期的类:它可以是具有公共(public)构造函数的典型不可变 POJO。

然后,当你需要它作为单例时,就将它作为单例使用。为了进行测试,请以其他方式使用它。

通常,依赖注入(inject)是解决这些问题的首选途径:您无需为配置对象硬编码机制,而是将对象传递给任何需要它的类。然后您可以稍后决定要提供什么 bean 。

由于您可能没有使用 Spring(否则依赖注入(inject)将成为您的默认设置),请考虑使用 Guice,这是一种非常轻量级且非侵入式的依赖注入(inject)方法。

关于java - Singleton Util 类的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24837405/

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