Анонимный класс как член класса - PullRequest
0 голосов
/ 05 мая 2018

Я нашел это в статье. Он реализует Parcelable для передачи данных между действиями в Android

public class Student implements Parcelable {

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public Student createFromParcel(Parcel in) {
        return new Student(in);
    }

    public Student[] newArray(int size) {
        return new Student[size];
    }
};

private long id;
private String name;
private String grade;

// Constructor
public Student(long id, String name, String grade){
    this.id = id;
    this.name = name;
    this.grade = grade;
}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getGrade() {
    return grade;
}

public void setGrade(String grade) {
    this.grade = grade;
}

// Parcelling part
   public Student(Parcel in){
       this.id = in.readLong();
       this.name = in.readString();
       this.grade =  in.readString();
   }

@Override
public int describeContents() {
    return 0;
}

@Override
   public void writeToParcel(Parcel dest, int flags) {
    dest.writeLong(this.id);
    dest.writeString(this.name);
    dest.writeString(this.grade);
   }

@Override
public String toString() {
    return "Student{" +
            "id='" + id + '\'' +
            ", name='" + name + '\'' +
            ", grade='" + grade + '\'' +
            '}';
}
}

В этом примере поле CREATOR объявлено и реализует интерфейс Parcelable.Creator. Это анонимный класс. Означает ли это, что анонимные классы также могут быть созданы как члены класса? и я узнал из других источников, что анонимные классы не могут быть статическими, но здесь они объявлены как статические. Я не понимаю контекст анонимного класса в этом примере. Может кто-нибудь объяснить это?

1 Ответ

0 голосов
/ 05 мая 2018

Означает ли это, что анонимные классы также могут быть созданы как члены класса?

Вы можете сохранить анонимную ссылку на экземпляр класса в поле, да.

и я узнал из других источников, что анонимные классы не могут быть статическими, но здесь он объявлен как статический

Это правда, что анонимные классы не могут быть явно static. Но они могут использоваться в статическом контексте (как в примере, который вы опубликовали - инициализация статического поля), что делает их неявно статичными. Спецификация языка Java охватывает это в 15.9.2 :

Пусть C будет создаваемым классом, а i будет создаваемым экземпляром. Если C является внутренним классом, то i может иметь непосредственно включающий экземпляр ( §8.1.3 ), определяемый следующим образом:

Если C - анонимный класс, то:

  • Если выражение создания экземпляра класса происходит в статическом контексте, то i не имеет немедленно включающего экземпляра.

  • В противном случае немедленно включающий экземпляр i будет this.

...