我刚刚创建了一个 Parcelable
,我必须在 Parcelable
中创建一个 CREATOR
字段并实现 2 个方法。问题是 CREATOR
实际上实现了 Parcelable.Creator
的接口(interface)。我不明白的是如何创建接口(interface)实例。
通常我认为我们会在我的自定义类上使用“实现”这个词。
我来自 .NET,所以这可能就是它看起来有点奇怪的原因。这是一个例子。:
public static final Parcelable.Creator<Account> CREATOR = new Parcelable.Creator<Account>() {
public Account createFromParcel(Parcel in) {
return new Account(in);
}
public Account[] newArray(int size) {
return new Account[size];
}
};
最佳答案
像这样创建接口(interface)的实例称为声明匿名类。
public static final Parcelable.Creator<Account> CREATOR = new Parcelable.Creator<Account>() {
public Account createFromParcel(Parcel in) {
return new Account(in);
}
public Account[] newArray(int size) {
return new Account[size];
}
};
相当于正常实现接口(interface)是这样的:
private static class ExampleCreator implements Parcelable.Creator<Account> {
public Account createFromParcel(Parcel in) {
return new Account(in);
}
public Account[] newArray(int size) {
return new Account[size];
}
}
然后像这样创建一个公共(public)静态字段:
public static final Parcelable.Creator<Account> CREATOR = new ExampleCreator();
但是您不是在命名类中显式实现接口(interface),而是隐式实现接口(interface)而不给生成的类一个名称,这就是它被称为匿名类的原因!
做这样的事情在 Java 中很常见,而且无论人们是否知道,它总是会发生。例如,您可以对抽象类做同样的事情:
public static abstract class SomeAbstractClass {
public abstract void fooTheBar();
public void doSomething() {
System.out.println("Something happened!");
}
}
public SomeAbstractClass someInstance = new SomeAbstractClass() {
@Override
public void fooTheBar() {
System.out.println("The bar is fooed!");
}
};
这里 someInstance
字段的类型实际上不是 SomeAbstractClass
而是另一个扩展 SomeAbstractClass
但额外实现 fooTheBar( )
。
您必须专门创建这个 Parcelable.Creator
匿名类作为公共(public)静态字段的原因只是约定俗成。每个 Parcelable
都必须定义一个实现 Parcelable.Creator
的常量字段。该框架在运行时查找该字段并使用它来创建该特定 Parcelable
的实例。
关于java - 可包裹 : Creating an instance of creator and implementing methods inline - CREATOR is an interface?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31838105/