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