У меня есть базовый класс
public class base
{
//some stuff
}
и несколько подклассов
public class sub1 extends base
{
static int variable;
}
public class sub2 extends base
{
static int variable;
}
и т.д
Статическая переменная int существует в каждом подклассе, потому что я храню в ней информацию, которая характерна для каждого подкласса. Но было бы лучше, если бы был способ переместить статическую переменную int в базовый класс таким образом, что она все равно будет отличаться для каждого подкласса. Теперь, когда я повторяю себя, добавляя еще один подкласс, это плохая практика.
Итак, у кого есть идея, как это сделать? Может быть, есть шаблон дизайна, который подходит для этой ситуации?
Не используйте для этого статическое поле - это не путь, потому что статические поля подкласса не "переопределяют" суперкласса.
Вместо этого, поскольку значения являются постоянными для данного класса, используйте поле конечного экземпляра:
public class Base {
protected final int variable;
public Base() {
this(5);
}
protected Base(int v) {
variable = v;
}
}
public class Sub1 extends Base {
private static int v = 7;
public Sub1() {
super(v);
}
}
Теперь переменная фиксирована и доступна для всех экземпляров.
abstract
и удалить конструктор по умолчанию
Вы не можете переместить все разные статические переменные из производных классов в базовый класс, потому что static
переменные являются отдельными классами; вы хотите, чтобы ваши переменные составляли один подклассом, что недопустимо.
Вы можете обойти эту проблему, указав реестр подклассов в вашем базовом классе и сохраните int
для каждого подкласса. Однако это добавило бы намного большую сложность, и неясно, как вы бы разделили между подклассами в суперклассе.
Ваше текущее решение кажется оптимальным.
Вы можете переместить переменную в базовый класс, но она не может быть статичной. Кроме того, вы можете создавать статические геттеры, которые вы переопределяете в каждом подклассе. Вот пример и того, и другого:
public class base {
protected int variable;
protected static int getVariable() {
return -1;
}
}
public class Sub1 extends base {
public Base() {
variable = 0;
}
protected static int getVariable() {
return 0;
}
}
public class Sub2 extends base {
public Sub2() {
variable = 1;
}
protected static int getVariable() {
return 1;
}
}
Как принцип проектирования, несколько реже (на мой взгляд), что вы действительно хотите статические методы. Обычно у вас будет какой-то экземпляр класса, вокруг которого вы работаете. Если вы хотите, чтобы целая куча объектов использовала общее поведение, которое вы настраиваете во время выполнения, вы можете проверить шаблон мухи.
base b = new Sub2(); b.getVariable();
вернет -1
.