android - extensions - kotlin visibility package




A cosa serve il campo di appoggio di Kotlin? (2)

I campi di supporto sono utili per l'esecuzione di convalide o l'attivazione di eventi al cambio di stato. Pensa alle volte in cui hai aggiunto il codice a un setter / getter Java. I campi di supporto sarebbero utili in scenari simili. Utilizzeresti i campi di supporto quando necessario per controllare o avere visibilità sui setter / getter.

Quando si assegna il campo con il nome del campo stesso, si sta effettivamente invocando il setter (ovvero set(value) ). Nell'esempio che hai, this.counter = value in set (value) fino a quando non overflow del nostro stack. L'uso del field ignora il codice setter (o getter).

Come sviluppatore Java, il concetto di campo di supporto è un po 'estraneo a me. Dato:

   class Sample {
        var counter = 0 // the initializer value is written directly to the backing field
        set(value) {
            if (value >= 0) field = value
        }
    }

A cosa serve questo campo di supporto? I documenti di Kotlin dicevano: le classi in Kotlin non possono avere campi. Tuttavia, a volte è necessario disporre di un campo di supporto quando si utilizzano accessori personalizzati . Perché? Qual è la differenza con l'utilizzo del nome della proprietà stessa all'interno del setter, ad es.

    class Sample {        
        var counter = 0
        set(value) {
            if (value >= 0) this.counter = value // or just counter = value?
        }
    }

Inizialmente, anche io ho avuto difficoltà a capire questo concetto. Quindi lascia che te lo spieghi con l'aiuto di un esempio.

Considera questa classe di Kotlin

class DummyClass {
    var size = 0;
    var isEmpty
        get() = size == 0
        set(value) {
            size = size * 2
        }
}

Ora, quando guardiamo il codice, possiamo vedere che ha 2 proprietà, ad esempio: size (con accessori predefiniti) e isEmpty (con accessori personalizzati). Ma ha solo 1 campo, cioè size . Per capire che ha solo 1 campo, vediamo l'equivalente Java di questa classe.

Vai su Strumenti -> Kotlin -> Mostra codice byte Kotlin in Android Studio. Fai clic su Decompila.

   public final class DummyClass {
   private int size;

   public final int getSize() {
      return this.size;
   }

   public final void setSize(int var1) {
      this.size = var1;
   }

   public final boolean isEmpty() {
      return this.size == 0;
   }

   public final void setEmpty(boolean value) {
      this.size *= 2;
   }
}

Chiaramente possiamo vedere che la classe java ha solo funzioni getter e setter per isEmpty e non esiste un campo dichiarato per questo. Analogamente in Kotlin, non esiste un campo di supporto per la proprietà isEmpty , poiché la proprietà non dipende affatto da quel campo. Quindi nessun campo di appoggio.

Ora rimuoviamo il getter e il setter personalizzati della proprietà isEmpty .

class DummyClass {
    var size = 0;
    var isEmpty = false
}

E l'equivalente Java della classe sopra è

public final class DummyClass {
   private int size;
   private boolean isEmpty;

   public final int getSize() {
      return this.size;
   }

   public final void setSize(int var1) {
      this.size = var1;
   }

   public final boolean isEmpty() {
      return this.isEmpty;
   }

   public final void setEmpty(boolean var1) {
      this.isEmpty = var1;
   }
}

Qui vediamo sia la size campi che isEmpty . isEmpty è un campo di supporto perché il getter e il setter per la proprietà isEmpty dipendono da esso.







kotlin-android-extensions