java - 几乎总是将没有状态的类写成单例?

标签 java singleton

今天在一个项目中看到了如下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/

相关文章:

Java-R 桥 "JRI"错误 : R is already initialized

android - 更改应用程序中的选项卡名称

java - Clojure 中的无符号 16 位整数

Java-将列表传递给按引用传递的方法

java - 双重检查锁定模式 : Broken or not?

Java 单例和同步

javascript - 带有条件参数的javascript中的单例类

java - 为什么 System.out.println 的输出与 bufferedwriter 不同?

java - 创建 XML 文档 "SAX style"?

java - iBatis 3、JAVA、ORACLE 及函数