![](/img/trans.png)
[英]What is the difference between a class wrapper and Java, and a singleton in Objective-C?
[英]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 的Collections
或Files
类——它们没有字段或任何可以修改的状态)总是可以的。 有状态的单例,比如这个,通常不是。 如果必须,请使用注入框架。
在编写测试时,您倾向于设置虚拟版本或以其他方式配置某些对象,而不是在正常运行时,并且您通常希望能够重复创建在正常运行时仅创建的东西(以隔离测试)一次。 单身人士和“我写了一个单元测试”彼此不喜欢。
制作场地 - 如果可以的话,修复所有其他问题。 至少使用该字段,您可以稍后重构您的代码并使其可以拥有多个Data
(希望您将其重命名),即使只是为了测试目的。 系统属性:
setProperty
方法上设置条件断点,该方法有各种风格,oof。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.