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.
RECORDS VS CLASSES
Records can have constructors and operators but NOT methods. Classes can have constructors, methods and operators. Records are for DATA (fields visible, generated operators); classes are for BEHAVIOUR (fields private, explicit methods).
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 coordinateSum() 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 total <- coordinateSum(point) stdout.println(`Sum: ${total}`)
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?
- Why do class fields need accessor methods but record fields don't?
- How do I access data in a record vs a class in EK9?
- What is the visibility difference between records and classes?
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: record, visibility, private, access, accessor, class, public, field