创建没有构造函数的NumberFormat

时间:2018-12-08 19:54:34

标签: java constructor instantiation

我有以下课程:

import java.text.NumberFormat;

public static class NF
{
    public static NumberFormat formatShares = NumberFormat.getInstance();
    public static NumberFormat formatCash = NumberFormat.getInstance();

    public NF(){
        formatShares.setGroupingUsed(true);
        formatShares.setMaximumFractionDigits(0);
        formatCash.setGroupingUsed(true);
        formatCash.setMaximumFractionDigits(2);
        formatCash.setMinimumFractionDigits(2);
   }       
}

总有办法做到这一点,所以我不必实例化该类吗?本质上,我希望能够只使用NF.formatCash.format(1234567.456)

3 个答案:

答案 0 :(得分:3)

您可以在静态初始化块中修改NumberFormat对象:

public static class NF {
    public static NumberFormat formatShares = NumberFormat.getInstance();
    public static NumberFormat formatCash = NumberFormat.getInstance();

    static {
        formatShares.setGroupingUsed(true);
        formatShares.setMaximumFractionDigits(0);
        formatCash.setGroupingUsed(true);
        formatCash.setMaximumFractionDigits(2);
        formatCash.setMinimumFractionDigits(2);
   }       
}

初始化类时,初始化块中的代码将运行,因此无需创建NF的实例即可执行代码。

答案 1 :(得分:0)

您可以将您的班级变成单身。

这并不完全是您想要的格式,但是它确实满足您的要求,因为您不必自己实例化该类,当您要使用NF时,它会自动完成。

NF.getInstance().formatCash.format(1234567.456)

您的课程将如下所示:

public class NF {
    public NumberFormat formatShares = NumberFormat.getInstance();
    public NumberFormat formatCash = NumberFormat.getInstance();

    private static NF theInstance;

    private NF() {
        formatShares.setGroupingUsed(true);
        formatShares.setMaximumFractionDigits(0);
        formatCash.setGroupingUsed(true);
        formatCash.setMaximumFractionDigits(2);
        formatCash.setMinimumFractionDigits(2);
    }

    public static NF getInstance() {
        if (theInstance == null) {
            theInstance = new NF();
        }
        return theInstance;
    }
}

答案 2 :(得分:0)

实际上这是不可能的。您直接或间接创建至少一个NumberFormat实例。您可以减少这些实例的数量。

使用static对象:

public static final NumberFormat formatShares = NumberFormat.getInstance();

static {
    formatShares.setGroupingUsed(true);
    formatShares.setMaximumFractionDigits(0);
}

对于多个线程,这是不正确的,因为NumberFormat未保存线程。

在每个线程的实例上使用ThreadLocal

public static final ThreadLocal<NumberFormat> threadLocalFormatShares = ThreadLocal.withInitial(() -> {
    NumberFormat nf = NumberFormat.getInstance();
    nf.setGroupingUsed(true);
    nf.setMaximumFractionDigits(0);
    return nf;
});

NumberFormat formatShares = threadLocalFormatShares.get();

我认为这可以解决您的问题。