Are record fields public or private in EK9?
← Classes and OOP · Ref: Q976
Record fields are PUBLIC — accessed directly by name.
Class fields are PRIVATE — accessed only through methods or operators.
RECORD (public fields):
defines record Coordinate latitude as Float: 0.0 longitude as Float: 0.0
// Access directly: point <- Coordinate(51.5, -0.1) stdout.println(`Lat: ${point.latitude}`) direct field access
CLASS (private fields):
defines class Location latitude as Float: 0.0
latitude() as pure <- rtn as Float: latitude
// Must use accessor method: loc <- Location(51.5) stdout.println(`Lat: ${loc.latitude()}`) method call, not field
Records are for DATA — fields visible, auto-generated operators.
Classes are for BEHAVIOUR — fields hidden, explicit methods.
Records can have constructors and operators but NOT methods.
Classes can have constructors, methods, AND operators.
See Q900 for full visibility comparison. See Q876 for record basics.
Example
defines module qa.classesandoop.recordpublicclass defines record <?- Record fields are PUBLIC — direct access. -?> Point x as Float: 0.0 y as Float: 0.0 Point() -> x as Float y as Float this.x :=: x this.y :=: y default operator defines class <?- Class fields are PRIVATE — accessor methods required. -?> Circle radius as Float: 0.0 Circle() -> radius as Float this.radius :=: radius radius() as pure <- rtn as Float: radius default operator defines program VisibilityDemo() stdout <- Stdout() // Record: direct field access (PUBLIC) point <- Point(3.0, 4.0) stdout.println(`Point x: ${point.x}, y: ${point.y}`) // Class: must use accessor method (PRIVATE) circle <- Circle(5.0) stdout.println(`Radius: ${circle.radius()}`)
Common mistakes
E06180 — Class fields are private in EK9, so reading circle.radius directly is not accessible from this context — use the accessor method circle.radius(). See ek9 -h E06180 for details.
Incorrect:
circle.radius
Correct:
circle.radius()
Other ways to ask this
- Can I access record fields directly 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 records: fields are private, accessed via generated accessors. Kotlin data classes: properties are public by default. Python dataclasses: attributes are public. EK9 records: fields are PUBLIC (direct access). EK9 classes: fields are PRIVATE (method access only).
Keywords: class, private, visibility, field, record, public, accessor