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

Java 为什么我们需要一个空构造函数从Firebase传递/保存数据?,java,android,firebase,firebase-realtime-database,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)

也许这个问题有点简单,但我不明白为什么我们需要一个空构造函数来从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

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


我们可以只创建一个类而不键入空构造函数吗?这将是相同的结果吗?

将使用反射填充类的字段。但是如果没有构造函数,就不能创建“默认”对象(意思是:没有预先填充的字段)。Firebase无法自行确定构造函数的作用,因此需要一个空构造函数:允许Firebase创建对象的新实例,然后使用反射填充该实例

这并不是Firebase所特有的:在框架或库为您填充对象(如JPA/Hibernate)的任何地方,您都会发现空构造函数


编辑:为了完整起见,正如@Lutzi所提到的,一旦定义了自己的构造函数,Java定义的默认空构造函数就不再可用,这就是为什么需要显式定义它的原因。

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


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

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

  • 该类具有空构造函数,这是Firebase自动数据映射所必需的

  • 如果类是按照上述方式构造的,Firebase可以在
    DatabaseReference#setValue()
    中执行自动序列化,在
    DataSnapshot#getValue()
    中执行自动反序列化

    更多信息请点击此处:


    当Firebase Real Time database SDK反序列化来自数据库的对象时,它要求任何正在使用的对象都具有公共的
    无参数构造函数
    ,以便可以使用它来实例化对象。对象中的字段是通过使用公共setter方法或直接访问公共成员来设置的

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

    在您的代码中,您的
    Hero
    类定义了这样一个包含参数的构造函数:

    public Hero(String name, String weapon, String description, String price, String discount, String id) {}
    
    只要存在此构造函数,就不需要定义无参数构造函数


    另外请注意,setter和getter也不是必需的。setter始终是可选的,因为如果JSON属性没有setter,Firebase客户端将直接在字段上设置值。也不需要具有参数的构造函数。这两种语言都是惯用的,并且有一些不使用它们的好例子。如果将字段公开,那么getter也是可选的。

    哇,这是一个非常有帮助的答案,现在我明白了为什么在android Studio上使用框架/库时需要空构造函数。谢谢,请注意,您不需要getter和setter。setter始终是可选的-如果没有它们,Firebase将直接修改字段。如果将字段
    设置为公共
    ,则getter也是可选的。