Why extensions add without modifying in Kotlin - Performance Analysis
When we add new features using extensions in Kotlin, we want to know how this affects the program's speed.
We ask: How does adding extensions change the work the program does as input grows?
Analyze the time complexity of the following code snippet.
fun List<Int>.sumOfSquares(): Int {
var sum = 0
for (num in this) {
sum += num * num
}
return sum
}
fun main() {
val numbers = listOf(1, 2, 3, 4, 5)
println(numbers.sumOfSquares())
}
This code adds a new function to List<Int> that calculates the sum of squares of its elements without changing the original List class.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through each element of the list to calculate its square and add it.
- How many times: Once for each element in the list (n times).
As the list gets bigger, the function does more work by repeating the square and add steps for each new item.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 squares and adds |
| 100 | About 100 squares and adds |
| 1000 | About 1000 squares and adds |
Pattern observation: The work grows directly with the number of items; double the items, double the work.
Time Complexity: O(n)
This means the time to run the extension grows in a straight line with the size of the list.
[X] Wrong: "Adding an extension function changes the original class and makes it slower overall."
[OK] Correct: Extensions add new functions without changing the original class code, so they only add the cost of their own operations, not extra hidden work.
Understanding how extensions work helps you explain how new features can be added safely without slowing down existing code, a useful skill in many coding tasks.
What if the extension function called another function inside a nested loop? How would the time complexity change?
Practice
Solution
Step 1: Understand how extensions work
Kotlin extensions define new functions outside the original class without altering its source code.Step 2: Compare with other options
Options A, B, and D involve modifying or replacing the original class, which extensions do not do.Final Answer:
They create new functions outside the class without changing its code -> Option AQuick Check:
Extensions add functions externally = C [OK]
- Thinking extensions modify original class code
- Confusing extensions with inheritance
- Believing extensions replace methods at runtime
greet for the String class in Kotlin?Solution
Step 1: Recall extension function syntax
Extension functions are declared asfun ClassName.functionName(), so for String:fun String.greet().Step 2: Validate options
fun String.greet() { println("Hello") } matches correct syntax. Others have wrong parameter placement or return type.Final Answer:
fun String.greet() { println("Hello") } -> Option DQuick Check:
Extension syntax = fun ClassName.functionName() [OK]
- Placing class name as parameter instead of receiver
- Incorrect return type syntax
- Using function without receiver type
fun String.shout() = this.uppercase() + "!"
fun main() {
val word = "hello"
println(word.shout())
}Solution
Step 1: Understand the extension function
The extensionshout()converts the string to uppercase and adds an exclamation mark.Step 2: Apply the function to "hello"
"hello" becomes "HELLO" plus "!" resulting in "HELLO!".Final Answer:
HELLO! -> Option BQuick Check:
Uppercase + ! = HELLO! [OK]
- Assuming original string unchanged
- Confusing uppercase with capitalized
- Expecting runtime error for extension
fun Int.addFive() = this + 5
fun main() {
val number = 10
println(number.addfive())
}Solution
Step 1: Check extension function definition
The extensionaddFive()is correctly defined on Int with proper syntax.Step 2: Check function call in main()
The call usesaddfive()with lowercase 'f', which does not match the defined function name.Final Answer:
Function call uses wrong case: addfive() instead of addFive() -> Option CQuick Check:
Function names are case-sensitive = A [OK]
- Ignoring case sensitivity in function calls
- Thinking extension can't be on Int
- Assuming val variables can't use extensions
isEven() to the Int class that returns true if the number is even, without modifying the original Int class. Which Kotlin code correctly achieves this and why does it not change the original class?Solution
Step 1: Identify correct extension syntax
fun Int.isEven() = this % 2 == 0defines an extension function on Int usingfun Int.isEven(), which is the correct way.Step 2: Understand why original class is unchanged
Extensions add functions externally without modifying or rewriting the original Int class bytecode.Final Answer:
fun Int.isEven() = this % 2 == 0 // Adds function externally without changing Int class -> Option AQuick Check:
Extension adds function externally = D [OK]
- Trying to redefine Int class directly
- Confusing extension with normal function
- Attempting to assign function to class property
Ready to prove it?
Pass the test and this pattern moves unknown
