본문
170821(월) - Kotlin docs (Properties and Fields)
Kotlin docs
Properties and Fields
Declaring Properties
- class에서 mutable한 properties들 선언 가능
ㆍvar
ㆍval
Getters and Setters
- getter, setter는 option
var <propertyName>[: <PropertyType>] [= <property_initializer>] [<getter>] [<setter>]
- property가 infer 가능하다면 생략 가능
var allByDefault: Int? // error: explicit initializer required, default getter and setter implied var initialized = 1 // has type Int, default getter and setter
- read-only 는 setter가 허용되지 않음
val simple: Int? // has type Int, default getter, must be initialized in constructor val inferredType = 1 // has type Int and a default getter
- custom getter
val isEmpty: Boolean get() = this.size == 0
- custom setter
ㆍvalue는 다른이름 가능
var stringRepresentation: String get() = this.toString() set(value) { setDataFromString(value) // parses the string and assigns values to other properties }
- Kotlin 1.1 부터는 getter에서 infer 가능할 경우 property type 생략 가능
val isEmpty get() = this.size == 0 // has type Boolean
- body 변경 없이 accessor 나 annotation 변경가능
var setterVisibility: String = "abc" private set // the setter is private and has the default implementation var setterWithAnnotation: Any? = null @Inject set // annotate the setter with Inject
- Backing field
ㆍKotlin class에 field는 있을 수 없지만, custom accessor사용시 backing field가 필요하다.
ㆍfield 식별자를 사용하여 access 가능한 backing field 제공
var counter = 0 // the initializer value is written directly to the backing field set(value) { if (value >= 0) field = value }
ㆍproperty의 accessor에서만 사용 가능
ㆍaccessor중 하나 이상의 default implemetation을 사용하거나 custom accessor가 field 식별자를 통해 이를 참조하는 경우 backing field 생성
ㆍ다음의 경우 backing field가 없음
val isEmpty: Boolean get() = this.size == 0
- backing properties
ㆍ implicit backing field 작업을 수행하려는 경우 언제든지 backing property로 돌아갈 수 있다.
private var _table: Map<String, Int>? = null public val table: Map<String, Int> get() { if (_table == null) { _table = HashMap() // Type parameters are inferred } return _table ?: throw AssertionError("Set to null by another thread") }
Compile-time constants
ㆍcompile-time에 value가 알려진 property는 const modifier를 사용해서 constants로 표시될 수 있다.
ㆍ요구사항
- top level 또는 object의 member
- String 또는 primitive type으로 initalized
- no custom getter
const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated" @Deprecated(SUBSYSTEM_DEPRECATED) fun foo() { ... }
Late-Initialized Properties
ㆍInjection 및 unit test시에 property 초기화는 굉장히 불편하다.
ㆍconstructor에서 null이 아닌 initalizer를 제공할 수 없지만 class 내부에서 null 검사를 피하려고 한다.
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() // dereference directly } }
ㆍvar property에서만 사용 가능
ㆍprimary constructor에서 사용 불가
ㆍproperty에 custom getter, setter가 없어야 한다.
ㆍproperty는 non-null이어야 한다.
ㆍprimitive type이 아니어야 한다.
ㆍ초기화 되기전에 property에 access하면 Exception throw
Overriding properties
Delegated properties
'Mobile > Kotlin' 카테고리의 다른 글
170823(수) - Kotlin docs (Visibility Modifiers) (0) | 2017.08.23 |
---|---|
170821(월) - Kotlin docs (Interfaces) (0) | 2017.08.21 |
170818(금) - Kotlin docs (Classes and Inheritance) (0) | 2017.08.18 |
170621(수) - Kotlin docs (Return and Jumps) (0) | 2017.06.21 |
170619(월) - Kotlin docs (Control Flow) (0) | 2017.06.19 |
댓글