We decide between companion and top-level functions to organize code clearly and make it easy to use.
Companion vs top-level functions decision in Kotlin
class MyClass { companion object { fun companionFunction() { // code here } } } // Top-level function fun topLevelFunction() { // code here }
Companion functions live inside a class's companion object.
Top-level functions are declared outside any class.
add is called using the class name without creating an object.class Calculator { companion object { fun add(a: Int, b: Int) = a + b } } fun main() { println(Calculator.add(3, 4)) }
greet is called directly without any class.fun greet(name: String) { println("Hello, $name!") } fun main() { greet("Alice") }
This program shows using a companion function log inside Logger class and a top-level function printWelcome. Both are called without creating objects.
class Logger { companion object { fun log(message: String) { println("Log: $message") } } } fun printWelcome() { println("Welcome to the program!") } fun main() { Logger.log("Program started") printWelcome() Logger.log("Program ended") }
Use companion functions to keep related functions inside a class for better organization.
Use top-level functions for general utilities that don't fit inside a class.
Companion functions can access private members of the class, top-level functions cannot.
Companion functions belong to a class and are called with the class name.
Top-level functions are independent and called directly.
Choose companion functions to group related code; choose top-level for general helpers.
Practice
companion object function in Kotlin?Solution
Step 1: Understand companion object purpose
Companion object functions belong to a class and are called using the class name without needing an instance.Step 2: Compare with other options
Top-level functions are for general helpers, instance methods require an object, and functions inside functions are local functions.Final Answer:
When the function logically belongs to a class and should be called with the class name. -> Option AQuick Check:
Companion functions = class-related [OK]
- Confusing companion functions with instance methods
- Using companion for unrelated helper functions
- Thinking companion functions need an object instance
create inside a Kotlin class MyClass?Solution
Step 1: Recall companion object syntax
In Kotlin, companion functions are declared inside a companion object block within the class.Step 2: Check each option
class MyClass { companion object { fun create() { } } } correctly declares a companion object with a function. Syntaxes like fun companion create() { } and companion fun create() { } are invalid. companion object MyClass { fun create() { } } incorrectly places companion object outside the class.Final Answer:
class MyClass { companion object { fun create() { } } } -> Option BQuick Check:
Companion object syntax = class MyClass { companion object { fun create() { } } } [OK]
- Writing companion fun instead of inside companion object
- Placing companion object outside the class
- Using fun companion instead of companion object
class Example {
companion object {
fun greet() = "Hello from companion"
}
}
fun greet() = "Hello from top-level"
fun main() {
println(Example.greet())
println(greet())
}Solution
Step 1: Identify function calls
Example.greet() calls the companion object function returning "Hello from companion". The top-level greet() returns "Hello from top-level".Step 2: Understand call order in main()
First println prints Example.greet() output, second println prints top-level greet() output.Final Answer:
"Hello from companion" followed by "Hello from top-level" -> Option CQuick Check:
Companion vs top-level calls = "Hello from companion" followed by "Hello from top-level" [OK]
- Assuming name conflict causes error
- Mixing up which greet() is called
- Expecting runtime ambiguity error
class Data {
companion object {
fun info() = "Data info"
}
}
fun main() {
println(info())
}What is the error and how to fix it?
Solution
Step 1: Identify the call to info()
The main function calls info() directly, but info() is inside Data's companion object, so it must be called with Data.info().Step 2: Fix the call
Change println(info()) to println(Data.info()) to access the companion function correctly.Final Answer:
Error: Unresolved reference 'info'. Fix: Call as Data.info() -> Option AQuick Check:
Companion functions need class name prefix [OK]
- Calling companion function without class name
- Thinking companion functions are top-level
- Trying to move companion function outside class
formatDate() used by multiple unrelated classes in your Kotlin project. Which approach is best and why?Solution
Step 1: Analyze function usage
The function is a utility used by many unrelated classes, so it should be accessible without class dependency.Step 2: Choose best location
Top-level functions are ideal for general helpers to avoid unnecessary class coupling. Companion objects tie functions to one class, which is not suitable here.Final Answer:
Define formatDate() as a top-level function in a utility file for easy reuse. -> Option DQuick Check:
General helpers = top-level functions [OK]
- Placing utility in companion object of unrelated class
- Duplicating instance methods in multiple classes
- Using nested objects unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
