Java: альтернатива объявлению пустого конструктора для инициализации объекта из другого класса - PullRequest
0 голосов
/ 23 февраля 2019

Я создаю простое текстовое интерактивное приложение, в котором пользователю предлагается ввести данные.Каждый вход соответствует определенной команде, которая вызывает определенный метод.Поскольку существует много методов, я решил распределить их по разным классам.Таким образом, приложение работает так:

Основной класс отвечает за чтение пользовательского ввода (используя объект Scanner).Пользовательский ввод затем передается в качестве параметра методу B в классе B, который решает, какой команде соответствует ввод.После принятия решения метод вызывает правильный метод, который может быть в любом из других классов (в этом примере метод C в классе C)

Это означает, что мне нужно инициализировать экземпляры объекта, чтобы избежать нулевогоисключение указателя.У одного из классов, из которого мне нужно инициализировать объект, есть только конструктор с параметрами, но я на самом деле не хочу инициализировать объект значениями в этом случае, а только использовать его в качестве указателя на объект, поэтому яможет вызывать методы из этого класса.Теперь я использую пустой конструктор, чтобы решить эту проблему, но есть ли альтернатива, лучшее решение, чем объявление пустого конструктора?Я написал код, который, как мне кажется, демонстрирует мою проблему:

public class MainClass {
    ClassB classB = new ClassB();

    public void methodA {
        classB.methodB(userInput);
    }
}


public class ClassB {
    ClassC classC = new ClassC();

    public void methodB {
        classC.methodC();
    }
}


public class ClassC {
    String name;
    int age;

    public ClassC(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public ClassC() {
    }

    public void methodC() {
        // Do something
    }
}

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Реальный ответ: не делай этого.Видите ли, если в этом ClassC хранится информация об игроке ... сначала назовите его Player (даже при создании примеров: используйте значимые имена, чтобы люди понимали ваши намерения).

Как только мыЕсли говорить об игроках, становится ясно: объект Player, вероятно, должен моделировать игрока (человека или нет).Нет людей "без" имени или возраста.Это говорит вам: неправильный подход.Ваши классы и модели должны отражать реальность.

Вы не создаете пустой объект заранее;вы создаете их в тот момент времени, когда это имеет смысл (а затем вы предоставляете им необходимую информацию, чтобы в идеале вы могли сделать объекты неизменяемыми, объявив все свои поля окончательными).

Итак,Короче говоря: отойдите назад и переосмыслите свой дизайн.Если есть что-то, что не требует присутствия заполненного объекта Player, то это, вероятно, static метод и , вероятно, не сидеть на уроке игрока.

0 голосов
/ 23 февраля 2019

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

Проблема в том, что этим методам обычно требуется состояние объекта, чтобы иметь смысл (т. Е. Поля, которые нужно инициализировать).Если в вашем случае это не так, возможно, имеет смысл создать метод static (и вызвать ClassC.methodC()) или поместить эти методы в какой-то другой класс с конструктором по умолчанию.

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