Companion object with interfaces in Kotlin - Time & Space Complexity
Let's see how the time needed to run code with companion objects and interfaces changes as we use more data.
We want to know how the program's work grows when it calls interface methods inside a companion object.
Analyze the time complexity of the following code snippet.
interface Greeter {
fun greet(name: String): String
}
class Person {
companion object : Greeter {
override fun greet(name: String) = "Hello, $name!"
}
}
fun greetAll(names: List) {
for (name in names) {
println(Person.greet(name))
}
}
This code defines an interface and a companion object that implements it. It then greets each name in a list using the companion object.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through the list of names and calling the greet method for each.
- How many times: Once for each name in the input list.
Each new name adds one more greeting call, so the work grows evenly with the list size.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 greet calls |
| 100 | 100 greet calls |
| 1000 | 1000 greet calls |
Pattern observation: The number of operations grows directly with the number of names.
Time Complexity: O(n)
This means the time to run grows in a straight line with the number of names to greet.
[X] Wrong: "Calling a method on a companion object with an interface makes the code slower for each call."
[OK] Correct: Each call runs in constant time; the interface and companion object do not add extra loops or repeated work per call.
Understanding how companion objects and interfaces affect time helps you explain code design choices clearly and confidently.
"What if the greet method itself contained a loop over the input string's characters? How would the time complexity change?"
Practice
companion object in Kotlin?Solution
Step 1: Understand companion object role
A companion object is a special object inside a class that holds members shared by all instances.Step 2: Compare with instance members
Unlike instance variables, companion object members belong to the class itself, acting like static members.Final Answer:
To hold static-like members that belong to the class, not instances -> Option DQuick Check:
Companion object = static-like members [OK]
- Thinking companion object creates instances
- Confusing companion object with instance variables
- Believing companion object can inherit multiple classes
MyInterface inside a class MyClass?Solution
Step 1: Recall companion object syntax
The correct syntax iscompanion objectfollowed by a colon and the interface name.Step 2: Check each option
class MyClass { companion object : MyInterface { } } matches the correct syntax. The other options have incorrect keywords or order.Final Answer:
class MyClass { companion object : MyInterface { } } -> Option BQuick Check:
companion object : InterfaceName [OK]
- Using 'implements' keyword instead of ':'
- Swapping 'object' and 'companion' keywords
- Omitting the colon before interface name
MyClass.printMessage() is called?interface Printer {
fun printMessage()
}
class MyClass {
companion object : Printer {
override fun printMessage() {
println("Hello from companion")
}
}
}
fun main() {
MyClass.printMessage()
}Solution
Step 1: Understand companion object implementing interface
The companion object implements Printer and overrides printMessage to print a message.Step 2: Calling printMessage on class
CallingMyClass.printMessage()calls the companion object's method, printing the message.Final Answer:
Hello from companion -> Option AQuick Check:
Companion object method called = prints message [OK]
- Expecting instance creation before method call
- Thinking printMessage is not accessible on class
- Assuming compilation error due to interface
interface Logger {
fun log(message: String)
}
class Service {
companion object Logger {
override fun log(message: String) {
println("Log: $message")
}
}
}Solution
Step 1: Check companion object declaration
The code usescompanion object Logger, which names the object but does not implement the interface.Step 2: Correct syntax for interface implementation
To implement Logger, it should becompanion object : Loggerwith a colon.Final Answer:
Companion object must use ':' to implement interface, not name after object -> Option AQuick Check:
Use ':' to implement interface in companion object [OK]
- Confusing object name with interface implementation
- Omitting colon before interface name
- Thinking companion object cannot implement interfaces
Calculator with a companion object that implements an interface Operations having a method add(a: Int, b: Int): Int. How can you call add without creating an instance of Calculator?interface Operations {
fun add(a: Int, b: Int): Int
}
class Calculator {
companion object : Operations {
override fun add(a: Int, b: Int): Int = a + b
}
}Solution
Step 1: Understand companion object access
Companion object members can be called directly on the class name likeCalculator.add()(syntactic sugar) or explicitly viaCalculator.Companion.Step 2: Check method call options
Calculator.add(5, 3)is the standard direct call. B requires an instance which doesn't have the method. C calls the interface directly (wrong). D uses incorrect casing ("companion" instead of "Companion").Final Answer:
Call Calculator.add(5, 3) -> Option CQuick Check:
Class.method() = companion access [OK]
- Using lowercase 'companion' instead of 'Companion'
- Creating instance unnecessarily
- Trying to call interface name directly
Ready to prove it?
Pass the test and this pattern moves unknown
