【发布时间】:2017-09-19 17:28:11
【问题描述】:
我正在创建一个带有静态数组列表的 Coin 类,该类存储创建的类的每个实例,但是我需要使用初始实例启动该列表,而且我还没有弄清楚如何在不添加两次的情况下做到这一点(因为一个冗余代码),有什么建议吗?
public class Coin {
private static ArrayList<String> coinNames = new ArrayList<>();
private static ArrayList<String> coinAbbreviations = new ArrayList<>(Arrays.asList("CLP"));
private static ArrayList<Coin> coins =
new ArrayList<>(Arrays.asList(new Coin("Pesos chilenos", "CLP", 1f, "CLP")));
private static HashMap<String,Float> exchangeRates;
private String coinName;
private String coinAbbreviation;
private Float coinValue;
private String unit;
public Coin(String coinName, String coinAbbreviation, Float coinValue, String unit) {
assert !coinAbbreviations.contains(coinAbbreviation) : "Coin abbreviation already used";
assert coinAbbreviations.contains(unit) : "Coin unit non existent.";
assert !coinNames.contains(coinName) : "Coin name already used.";
this.coinName = coinName;
this.coinAbbreviation = coinAbbreviation;
this.coinValue = coinValue;
this.unit = unit;
coins.add(this);
}
}
【问题讨论】:
-
存储每个实例的静态数组列表不知道你想做什么
-
请记住,这种模式本质上是线程不安全的(也就是说,你基本上永远不能用它编写线程安全的代码),所以这是一个坏习惯。更好的方法是私有构造函数和调用该构造函数然后将实例添加到
coins的静态工厂方法。 -
最好有一个 CoinFactory 类来创建(并返回)Coin 实例并将它们添加到自身。您当前的解决方案不是线程安全的,这只是一个缺点。
-
@DodgyCodeException 你能解释一下吗,我认为这可能是解决方案
-
@NicolasQuiroz 我试图解释;在下面查看我的新答案。
标签: java arraylist java-8 static-initialization