今天在一个项目中看到了如下JavaFX相关代码:
issueComboBox.setConverter(new IntegerStringConverter());
yearComboBox.setConverter(new IntegerStringConverter());
然后想:我真的需要创建两个 IntegerStringConverter 实例吗?
IntegerStringConverter 具有以下代码:
public class IntegerStringConverter extends StringConverter<Integer> {
@Override public Integer fromString(String value) {
if (value == null) {
return null;
}
value = value.trim();
if (value.length() < 1) {
return null;
}
return Integer.valueOf(value);
}
@Override public String toString(Integer value) {
if (value == null) {
return "";
}
return (Integer.toString(((Integer)value).intValue()));
}
}
所以我不需要两个实例,因为 IntegerStringConverter 中也没有状态, 不在 StringConverter 中。 如果我可以重写该类,我会将其重写为单例,如下所示:
public final class IntegerStringConverter extends StringConverter<Integer> {
public static final IntegerStringConverter INSTANCE = new IntegerStringConverter();
private IntegerStringConverter() { }
@Override public Integer fromString(String value) {
if (value == null) {
return null;
}
value = value.trim();
if (value.length() < 1) {
return null;
}
return Integer.valueOf(value);
}
@Override public String toString(Integer value) {
if (value == null) {
return "";
}
return (Integer.toString(((Integer)value).intValue()));
}
}
所以这个类的用户不能创建多个实例:
issueComboBox.setConverter(IntegerStringConverter.INSTANCE);
yearComboBox.setConverter(IntegerStringConverter.INSTANCE);
它是 javafx.util.converter 包中的一个类。 我认为它没有按照我建议的方式实现,因为 JavaFX 开发人员 想给我们扩展这个类的可能性。
问题的关键在于,实现类( 它们不是只有静态方法的纯辅助类) 没有状态作为单例以防止内存和性能的多个实例化 原因?
最佳答案
我不能确切地说出为什么在 JavaFX 中这样做。
一个可能的解释是
单例不利于继承。您可以在将来扩展 IntegerStringConvertor
以提供更具体的实现。
关于java - 几乎总是将没有状态的类写成单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21459667/