Skip to main content

const vs val

const

The const keyword is used to declare properties that are immutable (i.e. read-only properties) at the compile time.

When to use const, required conditions as shown below:

  1. Should start from a primitive data type
    ex) Boolean, Int, Long, Char, String
  2. Must be at the top level or member of an object or a companion object
  3. No custom getter method
class Task (_name: String, _priority: Int = DEFAULT_PRIORITY) {
companion object {
const val MIN_PRIORITY = 1
const val DEFAULT_PRIORITY = 3
const val MAX_PRIORITY = 5
const val NAME = "KHAZIX"
const val TASK_INDEX_NAMES = Array<String>(5){i->"task $i"} // error occurs
}
}

This code must lead to following error:

Const 'val' has type 'Array<String>'. 
Only primitives and String are allowed

val

Initialized at runtime. As a result, you may assign a val variable a method or class

class Task(_name: String, _priority: Int = DEFAULT_PRIORITY){
companion object {
const val MIN_PRIORITY = 1
const val DEFAULT_PRIORITY = 3
const val MAX_PRIORITY = 5
val currentTimeStamp: LocalDateTime
get() = LocalDateTime.now()
}

private fun setNameWithTimestamp(_name : String) = _name + "_" + currentTimeStamp
private fun validPriority(p: Int) = p.coerceIn(MIN_PRIORITY, MAX_PRIORITY)
}

currentTimestamp declared with val is allocated in runtime. You are able to declare custom get method.

Example code

class Task(_name: String, _priority: Int = DEFAULT_PRIORITY){
companion object {
const val MIN_PRIORITY = 1
const val DEFAULT_PRIORITY = 3
const val MAX_PRIORITY = 5
val currentTimeStamp: LocalDateTime
get() = LocalDateTime.now()
}
var currentPriority = validPriority(_priority)
set(value) {
field = validPriority(value)
}

// custom setter
var name = setNameWithTimestamp(_name)
set(value) {
field = setNameWithTimestamp(value)
}

private fun setNameWithTimestamp(_name : String) = _name + "_" + currentTimeStamp
private fun validPriority(p: Int) = p.coerceIn(MIN_PRIORITY, MAX_PRIORITY)

}

📝Conclusion

Indexconstval
When to useVariable value to remain constantControl variable with custom method
Declaration timeCompileRuntime
Data typePrimitive and StringAll