1. Can you explain the differences between "val" and "var" in Kotlin and when you would use each?

Advanced

1. Can you explain the differences between "val" and "var" in Kotlin and when you would use each?

Overview

In Kotlin, understanding the differences between val and var is fundamental for developers as it directly relates to immutability (read-only) and mutability (read-write) properties of variables. Choosing the appropriate type can impact code safety, readability, and functionality. val denotes a read-only (immutable) property or local variable, whereas var represents a mutable property or local variable that can be reassigned.

Key Concepts

  1. Immutability vs. Mutability: val is immutable, meaning the reference it holds cannot be changed once assigned. var is mutable, allowing for reassignment.
  2. Safety and Predictability: Using val can lead to safer, more predictable code. Immutable objects are thread-safe by default.
  3. Performance Considerations: Immutability can potentially lead to better performance optimizations by the compiler.

Common Interview Questions

Basic Level

  1. What is the difference between val and var in Kotlin?
  2. How do you declare a read-only property in Kotlin?

Intermediate Level

  1. Can you modify the properties of an object referenced by a val variable?

Advanced Level

  1. Discuss how immutability (val) can affect performance and thread safety in Kotlin applications.

Detailed Answers

1. What is the difference between val and var in Kotlin?

Answer:
In Kotlin, val is used to declare a read-only (immutable) variable, meaning once it has been assigned, it cannot be reassigned to point to another object. On the other hand, var declares a mutable variable, which can be reassigned and changed over time.

Key Points:
- val stands for "value," implying it is a constant.
- var stands for "variable," implying it can be changed.
- Choosing between val and var affects code safety and readability.

Example:

val immutableString: String = "Hello, World!"  // Immutable, cannot be reassigned
var mutableNumber: Int = 42                    // Mutable, can be reassigned

// immutableString = "New String"              // Compilation error
mutableNumber = 43                             // Allowed

2. How do you declare a read-only property in Kotlin?

Answer:
A read-only property in Kotlin is declared using the val keyword. This means once a value has been assigned, it cannot be changed.

Key Points:
- val ensures the property is immutable.
- A read-only property can still have a custom getter to compute its value dynamically, without allowing it to be modified.
- Read-only does not mean the object itself is immutable, just the reference.

Example:

val readOnlyList: List<Int> = listOf(1, 2, 3)  // The list reference is read-only

// readOnlyList = listOf(4, 5, 6)              // Compilation error
// However, if the list itself was mutable, its contents could still change

3. Can you modify the properties of an object referenced by a val variable?

Answer:
Yes, the properties of an object referenced by a val variable can be modified, assuming those properties themselves are mutable. The val keyword only prevents reassignment of the variable to a different object.

Key Points:
- val makes the reference immutable, not the object itself.
- Mutable properties of an immutable reference can be changed.
- This is an important distinction for understanding object immutability in Kotlin.

Example:

class MutablePerson(var name: String)

val person = MutablePerson("John")
person.name = "Doe" // Allowed, changes property of the object

// person = MutablePerson("Alice") // Compilation error, can't reassign `person`

4. Discuss how immutability (val) can affect performance and thread safety in Kotlin applications.

Answer:
Immutability, achieved through the val keyword in Kotlin, can significantly enhance an application's thread safety and potentially its performance. Immutable objects are inherently thread-safe as their state cannot be modified once constructed, eliminating the need for synchronization. Furthermore, immutability can lead to better performance by allowing more straightforward caching of variables and reducing the overhead associated with locking in concurrent environments.

Key Points:
- Immutable objects simplify concurrent programming by removing the need for synchronization.
- Immutability can lead to optimizations by the compiler or runtime, such as avoiding defensive copies.
- Thread safety does not guarantee deadlock freedom but reduces the scope for errors.

Example:

val immutableList: List<Int> = listOf(1, 2, 3)  // Immutable, safe to share across threads

// Since immutableList cannot be modified, accessing it from multiple threads is safe.

By understanding and applying val and var appropriately, Kotlin developers can write more reliable, maintainable, and performant code.