Установка статической конечной переменной в конструкторе

что я в основном хочу:

public class Test 
{ 
 private static final Integer a;
 public Test(Integer a) 
 {
 this.a = a;
 }

}

Это явно не работает, потому что второй созданный экземпляр попытается переопределить конечную переменную. Итак, есть ли способ предоставить всем экземплярам одинаковое неизменяемое значение через конструктор?

2 ответа

Статические конечные значения должны быть инициализированы в статическом контексте, а не в экземплярах.

Один параметр - установить значение в объявлении:

private static final Integer a=FileConfig.getInstance().getA();

Каждый класс может иметь статический блок {}, где вызывается код для инициализации статических частей класса.

static {
 a = FileConfig.getInstance().getA();
}

Наконец, вы можете установить значение из статического метода

private static int getA() {
 return FileConfig.getInstance().getA();
}
private static final Integer a=getA();

В закрытии статическая инициализация экземпляра не принадлежит конструкторам экземпляра.

Если значения конфигурации иногда меняются, просто нет смысла хранить значение a в статической конечной переменной. Если вы хотите создать каждый экземпляр с константой a в конструкторе, какова цель статического поля в первую очередь? Как-то, когда вы вызываете конструктор в первый раз, вы передаете значение от где-то. Если значение заслуживает статичности и окончательности, вы можете получить его из статического инициализатора. Если конфигурация не является одиночной, но каждый экземпляр всегда производит одно и то же значение a, вы можете легко сделать a = new FileConfig().getA();.

Кроме этого, вы можете сделать значение не финальным, и будьте уверены, что, поскольку вы всегда ставите одно и то же значение a, статическая переменная не изменится.

Тем не менее, вы можете сделать a конечную переменную экземпляра класса, заданную в конструкторе.


Итак, есть ли способ предоставить всем экземплярам одинаковое неизменяемое значение через конструктор?

Я предполагаю, что вы хотите присвоить значение a при создании объекта типа Test, но не при создании любого последующего экземпляра. В этом случае вы не можете объявить его final. a сначала будет пустым, конструктор должен проверить, является ли он нулевым и назначить ему значение в этом случае.

Но я призываю вас взглянуть на дизайн, особенно, почему вызывающий должен предоставить значение. Не контр-интуитивно понятно, что после создания второго объекта Test Test.a не изменяется в следующем случае?

// assume this is the first `Test` object created:
Test t = new Test(5); // Test.a is 5
Test t = new Test(6); // Test.a is *still* 5

licensed under cc by-sa 3.0 with attribution.