rspec/rules/S3353/kotlin/rule.adoc

70 lines
2.1 KiB
Plaintext

== Why is this an issue?
If a local variable is never reassigned, it should be declared `val` to make it a constant within its scope.
This makes the code easier to read and protects the variable from accidental re-assignments in future code changes.
=== What is the potential impact?
==== Readability and Understanding
If a variable is declared `val`, it is evident to readers that the variable value is never altered but serves as a constant.
This makes it easier to understand the code because readers do not need to keep track of possible state changes of the variable.
==== Wrong code
Developers might intend for a variable to remain unchanged and have their code relying on that constraint.
For example, a variable could be expected to have a specific range.
Changing the value of the variable could break that constraint.
Also, developers could have assigned the wrong variable.
If the developers inject a value into a variable with an annotation, they should declare it as late initialized.
Declare variables that remain unchanged as `val` to avoid these mistakes.
== How to fix it
Replace the keyword `var` with `val`.
=== Code examples
==== Noncompliant code example
[source,kotlin,diff-id=1,diff-type=noncompliant]
----
fun resize(): Int {
var newLength = max(16, 2*bufferLength) // Noncompliant, `newLength` is assigned only once
allocBuffer(newLength)
return resize
}
class MyClass {
@inject
private var myVar: Int = 0 // Noncompliant, `myVar` is late initialized and should be declared as such
}
----
==== Compliant solution
[source,kotlin,diff-id=1,diff-type=compliant]
----
fun resize(): Int {
val newLength = max(16, 2*bufferLength) // Compliant
allocBuffer(newLength)
return resize
}
class MyClass {
@inject
private lateinit var myVar: Int // Compliant
}
----
== Resources
=== Documentation
* https://kotlinlang.org/docs/basic-syntax.html#variables[Kotlin Docs, Variables]
=== Articles & blog posts
* https://medium.com/techmacademy/kotlin-101-val-vs-var-behind-the-scenes-65d96c6608bf[Estefania Cassingena Navone, Kotlin 101: val vs. var Behind The Scenes!]