создать NumberFormat без конструктора - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть следующий класс:

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 голосов
/ 08 декабря 2018

Вы можете превратить свой класс в одноэлементный.

Это не совсем тот формат, который вам нужен, но он соответствует вашим требованиям, так как вам не нужно создавать экземпляр класса самостоятельно, это делается автоматически, когда вы хотитеиспользуйте 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;
    }
}
0 голосов
/ 08 декабря 2018

На самом деле это невозможно.Прямо или косвенно вы создаете хотя бы один экземпляр 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();

Я думаю, что это может решить вашу проблему.

0 голосов
/ 08 декабря 2018

Вы можете изменить свои 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 не потребуетсябыть создан для выполнения вашего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...