JAVA Наследование статического поля от базового класса таким образом, чтобы оно отличалось для каждого подкласса

1

У меня есть базовый класс

public class base
{
    //some stuff
}

и несколько подклассов

public class sub1 extends base
{
static int variable;
}
public class sub2 extends base
{
static int variable;
}

и т.д

Статическая переменная int существует в каждом подклассе, потому что я храню в ней информацию, которая характерна для каждого подкласса. Но было бы лучше, если бы был способ переместить статическую переменную int в базовый класс таким образом, что она все равно будет отличаться для каждого подкласса. Теперь, когда я повторяю себя, добавляя еще один подкласс, это плохая практика.

Итак, у кого есть идея, как это сделать? Может быть, есть шаблон дизайна, который подходит для этой ситуации?

  • 0
    Если значения разные, как вы повторяете себя?
  • 0
    Меняется ли значение для данного подкласса со временем или оно постоянно?
Показать ещё 2 комментария
Теги:
inheritance
static
field

3 ответа

0

Не используйте для этого статическое поле - это не путь, потому что статические поля подкласса не "переопределяют" суперкласса.

Вместо этого, поскольку значения являются постоянными для данного класса, используйте поле конечного экземпляра:

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);
    }
}

Теперь переменная фиксирована и доступна для всех экземпляров.

  • 0
    Да, но проблема в том, что приведенный мною пример упрощен, и в реальном коде переменная - это объект (я имею в виду какой-то большой объект), и будет большое количество объектов подклассов, созданных во время выполнения приложения, поэтому если сделать его нестатичным (создание новой переменной для каждого объекта того же подкласса), это повлияет на производительность.
  • 0
    @Rotek см. Изменение на подкласс, чтобы избежать воссоздания значения. Также, если Base никогда не используется напрямую, рассмотрите возможность сделать его abstract и удалить конструктор по умолчанию
0

Вы не можете переместить все разные статические переменные из производных классов в базовый класс, потому что static переменные являются отдельными классами; вы хотите, чтобы ваши переменные составляли один подклассом, что недопустимо.

Вы можете обойти эту проблему, указав реестр подклассов в вашем базовом классе и сохраните int для каждого подкласса. Однако это добавило бы намного большую сложность, и неясно, как вы бы разделили между подклассами в суперклассе.

Ваше текущее решение кажется оптимальным.

-2

Вы можете переместить переменную в базовый класс, но она не может быть статичной. Кроме того, вы можете создавать статические геттеры, которые вы переопределяете в каждом подклассе. Вот пример и того, и другого:

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;
    }
}

Как принцип проектирования, несколько реже (на мой взгляд), что вы действительно хотите статические методы. Обычно у вас будет какой-то экземпляр класса, вокруг которого вы работаете. Если вы хотите, чтобы целая куча объектов использовала общее поведение, которое вы настраиваете во время выполнения, вы можете проверить шаблон мухи.

  • 0
    Java не позволяет переопределять статические методы. То, что вы предлагаете, - это просто переопределение. Какой из методов будет вызван, определяется во время компиляции в соответствии с типом ссылочной переменной. Например: base b = new Sub2(); b.getVariable(); вернет -1 .
  • 0
    Какой смысл статического метода получения, который получает переменную, если он возвращает константу, независимо от того, какая переменная содержится?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню