Зачем нам нужен пустой конструктор для передачи / сохранения данных из Firebase? - PullRequest
0 голосов
/ 01 мая 2018

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

public class Hero{
String Name, Weapon, Description, Price, Discount, Id;

public Hero() {
}

public Hero(String name, String weapon, String description, String price, String discount, String id) {
    Name = name;
    Weapon= weapon;
    Description = description;
    Price= price;
    Discount = discount;
    Id= id;
}}

тогда нам нужны геттер и сеттер для каждого меню.

Но что вызывает головокружение: зачем нам пустой конструктор? Это действительно необходимо?

Можем ли мы просто создать класс, не вводя пустой конструктор? это будет тот же результат?

Ответы [ 4 ]

0 голосов
/ 02 мая 2018

Когда SDK базы данных Firebase Realtime десериализует объекты, поступающие из базы данных, требуется, чтобы все используемые объекты имели общедоступный no-argument constructor, поэтому он может использовать его для создания экземпляра объекта. Поля в объектах устанавливаются с помощью общедоступных методов установки или прямого доступа к открытым членам.

JavaBeans требует наличия конструктора без аргументов , но когда в классе Java вообще нет конструкторов, по умолчанию компилятор добавляет в него конструктор по умолчанию без аргументов. В тот момент, когда вы определяете какой-либо конструктор в классе (с одним или несколькими аргументами), конструктор по умолчанию без аргументов исчезает, и его больше не нужно определять.

В вашем коде ваш класс Hero определяет такой конструктор, который содержит аргументы:

public Hero(String name, String weapon, String description, String price, String discount, String id) {}

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

Также обратите внимание, что сеттеры и геттеры также не требуются. Установщики всегда являются необязательными, потому что если для свойства JSON нет установщика, клиент Firebase установит значение непосредственно в поле. Конструктор с аргументами также не требуется. Оба идиоматичны, и есть хорошие случаи, когда занятия проводятся без них. Если вы сделаете поля общедоступными, получатели также будут необязательными.

0 голосов
/ 01 мая 2018

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

Если вы определите какой-либо конструктор, который не является пустым конструктором, пустой конструктор по умолчанию, предоставляемый Java, больше не будет "вызываемым".

0 голосов
/ 01 мая 2018

При создании класса модели для Firebase, например:

public class Chat {
private String mName;
private String mMessage;
private String mUid;

public Chat() {}  // Needed for Firebase

public Chat(String name, String message, String uid) {
    mName = name;
    mMessage = message;
    mUid = uid;
}

public String getName() { return mName; }

public void setName(String name) { mName = name; }

public String getMessage() { return mMessage; }

public void setMessage(String message) { mMessage = message; }

public String getUid() { return mUid; }

public void setUid(String uid) { mUid = uid; }
}
  1. Получатели и установщики следуют шаблону именования JavaBean , который позволяет Firebase сопоставлять данные с именами полей (например, getName () предоставляет поле имени).

  2. В классе есть пустой конструктор, который необходим для автоматического отображения данных в Firebase.

Если класс сконструирован, как указано выше, Firebase может выполнять автоматическую сериализацию в DatabaseReference#setValue() и автоматическую десериализацию в DataSnapshot#getValue().

подробнее здесь:

FirebaseUI README

setValue () Документы

0 голосов
/ 01 мая 2018

Поля класса будут заполнены с использованием отражения. Но вы не можете создать объект по умолчанию (то есть: без предварительно заполненных полей) без конструктора. Firebase не может самостоятельно определить, что делает ваш конструктор, поэтому вам нужен пустой конструктор: чтобы позволить Firebase создать новый экземпляр объекта, который затем будет заполнен с помощью отражения.

Это не относится к Firebase: пустой конструктор вы найдете везде, где фреймворк или библиотека заполняет для вас объект, например JPA / Hibernate.

Редактировать: для полноты, как уже упоминалось @Lutzi, после того, как вы определите свой собственный конструктор, пустой конструктор по умолчанию, который определяет Java, вам больше не доступен, поэтому вам нужно определить его явно.

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