Hisham-Developer Ответов: 1

Что значит продолжить объявление класса внутри конструктора класса?


Я нашел этот код и хочу понять, почему программист сделал это вместо того, чтобы продолжить объявление в той же строке?

public class Program {
    private Map<Integer, String> abc1;
    private Map<Integer, List<String>> abc2;
    private Function main;
    private StringBuilder Code1;

    public Program() {
        code 1 = new StringBuilder();
        abc1 = new HashMap<>();
        abc2 = new TreeMap<>();
    }
}


Что я уже пробовал:

Я попробовал это сделать

private Map<Integer, String> new HashMap<>() ;


но они прекрасно работают, есть ли какая-то разница между этими двумя способами?

Заранее спасибо

Maciej Los

Спросите автора вышеприведенного кода...

1 Ответов

Рейтинг:
7

phil.o

Единственное отличие заключается в том, что инициализация полей при объявлении, как в

private Map<Integer, String> abc1 = new HashMap<>();
это немного облегчает ситуацию (это личное мнение, которое можно было бы сильно оспорить, поскольку оно в основном зависит от контекста). Какой бы конструктор вы ни вызвали, Вы уверены, что эти поля будут правильно инициализированы.

В то же время, когда вы инициализируете эти поля внутри конструктора, вы должны убедиться, что поля правильно инициализированы и при использовании других конструкторов.
// Declaration without initialization
private Map<Integer, String> abc1;

// Default initializer
public Program()
{
   abc1 = new Map<Integer, String>();
}

// Initialize from parameter
public Program(Map<Integer, String> map)
{
   abc1 = map ?? new Map<Integer, String>();
}

// Initialize by calling default constructor
public Program(double someOtherField) : this()
{
   // ...
}


Hisham-Developer

Теперь я понимаю это очень ясно.
У программиста есть только один конструктор, поэтому лучше инициализировать его вне конструктора, так как у нас нет другого конструктора.

phil.o

Как бы то ни было, если поля правильно инициализированы, это уместно.

CPallini

5.