Are record fields public or private in EK9?
← Classes and OOP · Ref: Q1060
Record fields are PUBLIC. Class fields are PRIVATE. This is a fundamental difference.
RECORD — fields are public, accessed directly:
defines record Point xCoord as Float: 0.0 yCoord as Float: 0.0
point <- Point(3.0, 4.0) stdout.println($point.xCoord) direct access — works
CLASS — fields are private, accessed via methods:
defines class Circle radius as Float: 0.0
circle <- Circle(5.0) circle.radius WRONG — private field
Why records are public:
- Records are data carriers (like DTOs)
- Direct field access is the intended usage
- Functions operate on record data externally
- No encapsulation needed for pure data
Why classes are private:
- Classes encapsulate behaviour with data
- Access is through methods and operators
- Internal state is hidden
Records do NOT need getters or setters. Access fields directly. Use functions to operate on record data.
See Q97 for record basics. See Q98 for record operators. See Q93 for class basics.
Example
defines module qa.classesandoop.recordfieldspublic defines record Point xCoord as Float: 0.0 yCoord as Float: 0.0 Point() -> xCoord as Float yCoord as Float this.xCoord :=: xCoord this.yCoord :=: yCoord default operator defines function distanceFromOrigin() as pure -> point as Point <- rtn as Float: point.xCoord + point.yCoord defines program RecordFieldsDemo() stdout <- Stdout() point <- Point(3.0, 4.0) //Record fields are PUBLIC — direct access stdout.println(`X: ${point.xCoord}`) stdout.println(`Y: ${point.yCoord}`) //Functions operate on public record data dist <- distanceFromOrigin(point) stdout.println(`Distance: ${dist}`)
Common mistakes
E50060 — Records expose public fields accessed directly (point.xCoord); there are no getter methods, so point.getX() is an unresolved method. See ek9 -h E50060 for details.
Incorrect:
${point.getX()}
Correct:
${point.xCoord}
Other ways to ask this
- Can I access record fields directly in EK9?
- What is the difference between record and class field visibility?
- Do records have getters and setters in EK9?
Coming from another language?
Java: record fields are effectively public (via accessors). Python: dataclass fields are public. Rust: struct fields configurable. EK9: record=public, class=private — always.
Keywords: class, private, visibility, field, access, record, public