Как Java-разработчик, концепция резервное поле для меня немного иностранных. Дано:
class Sample {
var counter = 0 // the initializer value is written directly to the backing field
set(value) {
if (value >= 0) field = value
}
}
Что's это резервное поле хорош? Котлин документы сказал: занятия в Котлин не могут иметь полей. Однако, иногда необходимо иметь резервное поле при использовании нестандартных методов доступа. Почему? Какая разница с помощью свойства имени себя внутри сеттера, например.
class Sample {
var counter = 0
set(value) {
if (value >= 0) this.counter = value // or just counter = value?
}
}
Потому что, скажем, если вы не'Т есть "поле" ключевое слово, вы выиграли'т быть в состоянии, чтобы действительно установить/получить значение в()или
set(значение)`. Это позволит вам получить доступ к резервному полю в пользовательские средства доступа.
Это эквивалентно Java-код вашего образца:
class Sample {
private int counter = 0;
public void setCounter(int value) {
if (value >= 0) setCounter(value);
}
public int getCounter() {
return counter;
}
}
Видимо, это не есть хорошо, как сеттер-Это просто бесконечные рекурсии в себя, ничего не меняется. Помню в Котлин, когда тебе пишут фу.бар = значение
это будет переведено на вызов setter вместо PUTFIELD
.
Редактировать: в Java поля хотя Котлин имеет свойства, что является достаточно высоким уровнем, чем понятие поля.
Существует два типа свойств: один с резервного поля, одно без.
Свойство с резервное поле будет хранить значение в виде поля. Это поле обеспечивает хранение значений в памяти. Примером такого имущество является первый
и второй
свойства пара
. Это свойство будет меняться в памяти представление пара
.
Недвижимость без резервное поле будет хранить свои ценности в другие способы, чем непосредственно хранение ее в памяти. Она должна быть вычислены из других свойств, или сам объект. Примером такого имущество является собственностью расширение индексов
в список
, который не подкреплен поле, но вычисляемый результат, основанный на "размер" имущества. Поэтому он выиграл'т изменение в памяти представление список
(что это может'т делать, потому что Java-это статически типизированный).
Поначалу я тоже было трудное время понимание этой концепции. Итак, позвольте мне объяснить это с помощью примера.
Рассмотрим этот класс Котлин
class DummyClass {
var size = 0;
var isEmpty
get() = size == 0
set(value) {
size = size * 2
}
}
Теперь, когда мы смотрим на код, то можно увидеть, что он имеет 2 свойства я.е - размер
(с аксессоры по умолчанию) и пустой
(с пользовательского доступа). Но он имеет только 1 поле, т. е. "размер". Чтобы понять, что он имеет только 1 поле, давайте посмотрим Java-эквивалент этого класса.
Перейти к Инструменты -> Котлин -и GT; показать Котлин байт-кода в Android студия. Нажмите на декомпиляцию.
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;
}
}
Явно видно, что класс Java есть только геттер и сеттер функции пустой
, и нет никаких полей, объявленных за это. Аналогично в Котлин, нет резервное поле для свойства пустой
, поскольку собственность не'т зависит от этого поля вообще. Таким образом нет резервное поле.
Теперь давайте удалить пользовательские геттер и сеттер пустой
собственность.
class DummyClass {
var size = 0;
var isEmpty = false
}
И Java эквивалент выше класс
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;
}
}
Здесь мы видим, как размер поля и
пустой.
пустой- это резервное поле, потому что геттер и сеттер для
пустой` собственность зависеть от него.
Поддержка поля хороши для выполнения проверки или инициирующие события на изменение состояния. Думаю, со временем вы'вэ добавлен код Java в сеттер/геттер. Поддержка полей будут полезны в подобных ситуациях. Можно использовать резервных полях, когда вам нужно контролировать или иметь видимость через сеттеры/геттеры.
При назначении поля с полем имя себя, вы'вновь вызывая сеттер (т. е. набор(значения)``). В пример,
это.счетчик = значениебудут выполняться в установить(значения), пока мы не переполнить наш стек. Используя
поле`` обходит сеттер код (или добытчик).
В моем понимании, используя области идентификатор-ссылка на собственность's стоимостью в получить или Комплект, когда вы хотите изменить или использовать свойство's стоимостью в получить или комплект.
Например:
class A{
var a:Int=1
get(){return field * 2} // Similiar to Java: public int geta(){return this.a * 2}
set(value) {field = value + 1}
}
Затем:
var t = A()
println(t.a) // OUTPUT: 2, equal to Java code: println(t.a * 2)
t.a = 2 // The real action is similar to Java code: t.a = t.a +1
println(t.a) // OUTPUT: 6, equal to Java code: println(t.a * 2)