java - 可包裹 : Creating an instance of creator and implementing methods inline - CREATOR is an interface?

标签 java android

我刚刚创建了一个 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/

相关文章:

java - 每 5 秒更改一次 TextView

android - 由于意外的 uninstall.exe 文件,更新到 Android Studio 0.8.16 失败

android - gradle-android-scala-plugin 给出 "Could not find matching constructor"错误

java - 如何关闭首选项>编译>用户外部构建?

java - JTable setPreferredWidth() 用于显示不正确的列

java - 使用迭代器降序斐波那契数

java - 通过 Java Program 传递 Hadoop 程序命令

java - 如何使用Java使用foreachRDD发送数据

java - Android:在单击按钮时获取 Spinner 的 Textview 值

android - Grid Recyclerview,偶数行有 3 列,奇数行有 4 列