繁体   English   中英

Java:单例类中的系统属性和类变量有什么区别?

[英]Java: What's the difference between system property and class variable in singleton class?

我有一个看起来像这样的单例类

public class Data {
    private static Data data;
    private List<String> list;
   
    private Data() {
       list = new ArrayList<>();
    }
   
    public static Data getInstance() {
         if (data == null) {
             data = new Data();
         }
         return data;
    }

    public void process() {
        //check timestamp value
        //process values from list
    }
}

我想维护上次处理列表的时间戳。 但是我正在尝试决定是使用私有类变量来记录它还是创建一个系统变量,如System.setProperty("timestamp", System.currentTimeMillis()); 并访问它。 我的要求是我只想在 Data 类中访问这个值,但我正在运行另一个使用Data.process的类(比如 DataAccessor)的多个实例。 无论哪个 DataAccessor 实例调用Data.process ,我都想获得时间戳的最新值,但我不确定通过系统属性存储变量与单例类中的局部变量之间是否存在任何差异。

没关系,就代码风格而言,这已经很糟糕了,所以担心它似乎有点愚蠢。

这不是你制作单身人士的方式

如果您从多个线程调用getInstance() ,它实际上不会是单例。 写吧:

public class Data {
  private static final Data data = new Data();

  public static Data getInstance() {
    return data;
  }
}

你在做什么('懒惰'制作单例实例)是双重无用的:

  • 仅当您的代码“触及”类型( Data )但不调用getInstance()时,它首先才有用。 这对于所有单身人士来说都是罕见的。
  • 只有在创建实例的成本很高时才有用。 显然不是,这里。

这不是你命名课程的方式

Data不是很具有描述性。 它的非描述性几乎是陈词滥调。 更一般地说,一个类代表某种演员——它应该是一个名词。 例如,它应该是LogStorage ,如果这个东西的目的是存储日志,或者如果它专门表示记录它发出的现金的 ATM 的打印卷,则更好的AtmLogStorage 请明确点。

这不是一个很好的使用单例

可以想象一个系统运行 2 个独立的概念,这两个概念都需要相同的日志记录功能。

无状态单例(例如:java 的CollectionsFiles类——它们没有字段或任何可以修改的状态)总是可以的。 有状态的单例,比如这个,通常不是。 如果必须,请使用注入框架。

单例很难测试

在编写测试时,您倾向于设置虚拟版本或以其他方式配置某些对象,而不是在正常运行时,并且您通常希望能够重复创建在正常运行时仅创建的东西(以隔离测试)一次。 单身人士和“我写了一个单元测试”彼此不喜欢。

所以你会怎么做?

制作场地 - 如果可以的话,修复所有其他问题。 至少使用该字段,您可以稍后重构您的代码并使其可以拥有多个Data (希望您将其重命名),即使只是为了测试目的。 系统属性:

  • 无法控制(任何代码都可以读取和写入它们 - 你无法控制它)。
  • 是不可见状态,因为大多数 java 应用程序不使用 sysproperty 存储来写入数据。 因此,大多数工具都不是为了处理它而编写的。 如果有人更改了字段,则可以将调试工具设置为断点,在某些代码更改 sysproperty 时对它们进行断点要困难得多 - 需要拥有 java 核心源代码并在setProperty方法上设置条件断点,该方法有各种风格,oof。
  • 是“单例”并且不能从它那里重构,而一个字段本身就不是单例(事实上只有一个类的实例具有该字段,这使它成为一个单例,但是改变这方面和你的字段不再是一个。这很好)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM