Java 为什么我们需要一个空构造函数从Firebase传递/保存数据?
也许这个问题有点简单,但我不明白为什么我们需要一个空构造函数来从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)
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; }
}
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也是可选的。