为什么我们需要一个空的构造函数来传递/保存Firebase中的数据?

时间:2018-05-01 10:29:47

标签: java android firebase firebase-realtime-database

也许这个问题有点容易,但我不知道为什么我们需要一个空的构造函数来从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;
}}

然后我们需要每个菜单的getter和setter ..

但最让我头晕的是,为什么我们需要一个空的构造函数?这真的有必要吗?

我们可以在不输入空构造函数的情况下创建一个类吗?这会是同样的结果吗?

4 个答案:

答案 0 :(得分:1)

将使用反射填充该类的字段。但你无法创建一个"默认"没有构造函数的对象(意思是:没有预先填充的字段)。 Firebase无法自己弄清楚构造函数的作用,这就是为什么你需要一个空的构造函数:允许Firebase创建一个新的对象实例,然后用反射填充它。

这不是特定于Firebase的:您可以在框架或库为您填充对象的任何地方找到空构造函数,例如JPA / Hibernate。

编辑:完整性'因为@Lutzi提到,一旦你定义了自己的构造函数,Java定义的默认空构造函数就不再可用了,这就是你需要明确定义它的原因。

答案 1 :(得分:1)

为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. getter和setter遵循JavaBean命名模式,允许Firebase将数据映射到字段名称(例如:getName()提供名称字段)。

  2. 该类有一个空构造函数,这是Firebase自动数据映射所必需的。

  3. 如果类的构造与上述类似,Firebase可以在DatabaseReference#setValue()中执行自动序列化并在DataSnapshot#getValue()中执行自动反序列化。

    更多信息:

    FirebaseUI README

    setValue() Docs

答案 2 :(得分:0)

我不了解Firebase,但我可以通过全球方式回答您。你没有需要一个空的构造函数。但是如果使用参数定义构造函数,则将覆盖默认的空构造函数。这意味着除非您自己定义空构造函数,否则永远无法调用空构造函数。总结:

如果定义任何不是空构造函数的构造函数,Java提供的默认空构造函数将不再是"可调用"。

答案 3 :(得分:0)

当Firebase实时数据库SDK反序列化来自数据库的对象时,它要求所有正在使用的对象具有公共// Try to get instance tree for DWFX file var model = this.viewer.model; var modelData = model.getData(); var it = modelData.instanceTree; // get instance tree We have used another way to get element node id for DWFX file. (In that case, we are getting only panel label id for DWFX file) But that logic is not working for all DWFX files. // Try to get all ids for DWFX file var model = this.viewer.model; var modelData = model.getData(); var allIds = modelData.stringDbIds; // get all ids Please us know If I am using wrong approach to get all elements for DWFX file. ,以便它可以使用它来实例化对象。通过使用公共setter方法或直接访问公共成员来设置对象中的字段。

存在JavaBeans require a no-argument constructor但是当Java类根本没有构造函数时,编译器会自动添加一个默认的无参数构造函数。在您定义类中的任何构造函数(带有一个或多个参数)的那一刻,默认的无参数构造函数就会消失,无需再定义它。

在您的代码中,您的no-argument constructor类定义了包含参数的构造函数:

Hero

只要存在此构造函数,就不需要定义no-arg构造函数。

另请注意,也不需要制定者和吸气剂。 Setter始终是可选的,因为如果没有JSON属性的setter,Firebase客户端将直接将值设置到该字段上。也不需要带构造函数的参数。两者都是惯用的,有很好的案例可以没有它们。如果将字段设为公共字段,则getter也是可选的。