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