How do EK9 constructors work with parameters?
← Syntax and Structure Rules · Ref: Q894
EK9 constructor parameters use the '->' data-in port syntax on a SEPARATE LINE after the constructor name — like Go's named return values, the parameters are declared on their own indented block.
BASIC CONSTRUCTOR
The constructor shares the class name. Parameters use '->' on a separate line:
MyClass()
-> paramName as Type
this.field :=: paramName
The '->' means 'data coming IN' (like Go's named return parameters or Ada's 'in' port). The '<-' means 'data going OUT'.
MULTI-PARAMETER CONSTRUCTOR
Multiple parameters each get their own line under '->':
MyClass()
->
firstName as String
lastName as String
birthYear as Integer
this.firstName :=: firstName
this.lastName :=: lastName
this.birthYear :=: birthYear
BODY USES :=: FOR COPY ASSIGNMENT
Inside the constructor body, use ':=:' (copy operator) to copy parameter values into fields. This creates a COPY, ensuring the class owns its data.
SINGLE-LINE vs MULTI-LINE
Single parameter: -> on same line as parameter
Multiple parameters: -> on its own line, then parameters indented below
COMMON MISTAKES
- Putting -> and parameters on the class name line, or parameters inside the parentheses like Java (a syntax error with no error code)
- Using := instead of :=: for field assignment in constructor body
- Forgetting the () after the class name in the constructor
See Q93 for class definitions. See Q95 for field visibility. See Q881 for declaration vs assignment.
Example
#!ek9 defines module qa.syntax.constructors defines class <?- Single-parameter constructor. Like Go: func NewPerson(name string) *Person EK9: -> on separate line for data-in. -?> Greeting message as String: String() Greeting() -> message as String this.message :=: message getMessage() as pure <- rtn as String: message default operator <?- Multi-parameter constructor. Like Go named return params, each on own line. Body uses :=: (copy) to assign fields. -?> Employee employeeName as String: String() department as String: String() yearJoined as Integer: 0 Employee() -> employeeName as String department as String yearJoined as Integer this.employeeName :=: employeeName this.department :=: department this.yearJoined :=: yearJoined describe() as pure <- rtn as String: `${employeeName} in ${department} since ${yearJoined}` default operator <?- Constructor with default values via multiple constructors. Like Go's functional options pattern. -?> Configuration hostAddress as String: "localhost" portNumber as Integer: 8080 isSecure as Boolean: false Configuration() -> hostAddress as String portNumber as Integer isSecure as Boolean this.hostAddress :=: hostAddress this.portNumber :=: portNumber this.isSecure :=: isSecure Configuration() -> hostAddress as String portNumber as Integer this.hostAddress :=: hostAddress this.portNumber :=: portNumber describe() as pure <- rtn as String: `${hostAddress}:${portNumber} secure=${isSecure}` default operator defines program ConstructorDemo() stdout <- Stdout() hello <- Greeting("Welcome to EK9") stdout.println(hello.getMessage()) engineer <- Employee("Alice", "Engineering", 2023) stdout.println(engineer.describe()) defaultConfig <- Configuration("api.example.com", 443, true) stdout.println(defaultConfig.describe()) simpleConfig <- Configuration("localhost", 3000) stdout.println(simpleConfig.describe())
Other ways to ask this
- What is the constructor parameter syntax in EK9?
- How do I pass parameters to an EK9 constructor?
- Why does my EK9 constructor fail to parse?
- How do multi-parameter constructors work in EK9?
Coming from another language?
Go: func NewPerson(name string, age int) *Person — named returns on separate lines. Java: public MyClass(String name, int age) { this.name = name; } with braces. Python: def __init__(self, name, age): self.name = name. Kotlin: class MyClass(val name: String, val age: Int) — primary constructor inline. EK9: MyClass() with -> parameters on separate lines, body uses :=: copy operator — think Go's named parameters on separate lines.
Keywords: Go, arrow, assign, class, constructor, copy, data-in, multi-parameter, parameter, syntax