Зачем нам нужен пустой конструктор для передачи/сохранения данных из Firebase?

может быть, этот вопрос немного прост, но я не понимаю, зачем нам нужен пустой конструктор для передачи данных из 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;
}}

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

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

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


person Vian    schedule 01.05.2018    source источник
comment
Обратите внимание, что вам не нужны геттеры и сеттеры. Сеттеры всегда необязательны — без них Firebase просто напрямую изменит поле. Если вы сделаете поля public, геттеры также станут необязательными.   -  person Frank van Puffelen    schedule 01.05.2018


Ответы (4)


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

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

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

person SeverityOne    schedule 01.05.2018
comment
Вау! Такой действительно очень полезный ответ. Теперь я понял, почему нам нужен пустой конструктор при некотором использовании фреймворка/библиотеки в Android Studio. Спасибо друг - person Vian; 01.05.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().

больше информации здесь:

README FirebaseUI

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

person Peter Haddad    schedule 01.05.2018

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

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

person Lutzi    schedule 01.05.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 установит значение непосредственно в поле. Конструктор с аргументами также не требуется. Оба являются идиоматическими, и есть хорошие случаи, чтобы проводить занятия без них. Если вы сделаете поля общедоступными, геттеры также станут необязательными.

person Alex Mamo    schedule 02.05.2018