Kotlin 2.3.0 introduces explicit backing fields, a language feature that allows developers to declare the storage field of a property directly, rather than relying on the compiler-generated implicit backing field (field).
This change addresses long-standing limitations around property control, initialization, and visibility.
Background: Implicit Backing Fields (Before 2.3)
Historically, Kotlin properties used implicit backing fields, generated only when needed:
var count: Int = 0
get() = field
set(value) {
field = value
}
Key constraints:
- The backing field is implicit and unnamed
- Cannot control its visibility or annotations
- Cannot define multiple fields or alternative storage strategies
fieldis only accessible inside accessors
Kotlin 2.3: Explicit Backing Fields
Kotlin 2.3 introduces a new syntax that lets you explicitly declare the field that stores a property’s value.
Basic Example
var count: Int
field = 0
Here:
fieldis now a real declaration, not a compiler keyword- The property delegates its storage to this explicitly declared field
Custom Accessors with Explicit Fields
var count: Int
field = 0
get() = field
set(value) {
require(value >= 0)
field = value
}
This looks similar to older code, but the semantics differ:
fieldis no longer implicit- The backing storage is fully defined by the developer
Why This Matters
1. Precise Control Over Storage
You can now:
- Annotate backing fields
- Control initialization explicitly
- Prepare for multiple or alternative storage mechanisms
2. Better Tooling & Readability
- Backing storage is visible in code
- No hidden compiler behavior
- Easier reasoning for reviewers and static analysis tools
3. Enables Future Language Features
Explicit backing fields lay groundwork for:
- Multiple backing fields per property
- More advanced delegation patterns
- Better interop with native, WASM, and low-level targets
Comparison Summary
| Aspect | Implicit Field (≤ 2.2) | Explicit Field (2.3+) |
|---|---|---|
| Declaration | Compiler-generated | Developer-declared |
| Visibility control | No | Yes (future-ready) |
| Annotations | Not allowed | Allowed |
| Clarity | Implicit | Explicit |
| Extensibility | Limited | High |
Relation to the Community Discussion
The widely shared thread by @github_skydoves highlights this as a foundational change rather than syntactic sugar. While the immediate syntax looks modest, the architectural implications are significant—particularly for library authors and compiler plugin developers.
Practical Guidance
- Use explicit backing fields when you need clarity, extensibility, or advanced control.
- Continue using implicit fields for simple DTOs and idiomatic data holders.
- Expect gradual ecosystem adoption rather than immediate widespread usage.

