Mengapa saya tidak dapat menulis pembuat objek "sebaris" pada kelas final?

Ini adalah versi (non final) dari kelas.

public class ValidationResult {

    private boolean isValid;

    private int statusCode;

    private String statusMessage;

    public boolean isValid() {
        return isValid;
    }

    public void setValid(boolean valid) {
        isValid = valid;
    }

    public int getStatusCode() {
        return statusCode;
    }

    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }

    public String getStatusMessage() {
        return statusMessage;
    }

    public void setStatusMessage(String statusMessage) {
        this.statusMessage = statusMessage;
    }
}

Inilah yang baru dengan setter inline.

                ValidationResult vr = new ValidationResult() {{
                    setStatusCode(55555);
                    setValid(false);
                    setStatusMessage("This snipplet is working");
                }};

Saya membuat kelas pojo sederhana "final"

public final class ValidationResult {

    private boolean isValid;

    private int statusCode;

    private String statusMessage;

    public boolean isValid() {
        return isValid;
    }

    public void setValid(boolean valid) {
        isValid = valid;
    }

    public int getStatusCode() {
        return statusCode;
    }

    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }

    public String getStatusMessage() {
        return statusMessage;
    }

    public void setStatusMessage(String statusMessage) {
        this.statusMessage = statusMessage;
    }
}

Dan dengan inline baru yang sama

                ValidationResult vr = new ValidationResult() {{
                    setStatusCode(55555);
                    setValid(false);
                    setStatusMessage("Huh??");
                }};

मुझे मिलता है

Kesalahan: (23, 41) Java: Tidak dapat mewarisi dari final com.me.myproject.domain.validationResult

"tidak bisa mewarisi"?

Hah??

-1
granadaCoder 11 सितंबर 2020, 23:46

1 उत्तर

सबसे बढ़िया उत्तर

Ketika Anda menggunakan inisialisasi ganda kawat gigi, di belakang layar Anda membuat kelas dalam anonim yang memanjang kelas ValidationResult.

Di Jawa, Anda tidak diizinkan memperluas kelas dengan kata kunci final, karenanya kesalahan kompilasi yang Anda lihat.

juga, ingatlah kelemahan berikut saat menggunakan inisialisasi ganda kawat gigi:

  • mengaburkan, tidak diketahui cara untuk melakukan inisialisasi
  • itu menciptakan kelas tambahan setiap kali kita menggunakannya
  • tidak mendukung penggunaan "operator berlian" - fitur yang diperkenalkan di java 7
  • tidak berfungsi jika kelas yang kita coba perpanjangan ditandai akhir
  • memegang referensi tersembunyi ke instance lompatan, yang dapat menyebabkan kebocoran memori
3
Amin 11 सितंबर 2020, 20:58