Проверка неиспользуемых возвращаемых значений
Проверка неиспользуемых возвращаемых значений позволяет обнаруживать игнорируемые результаты. Это значения, возвращаемые выражениями, которые дают результат, отличный от Unit, Nothing или Nothing?, и при этом не:
сохраняются в переменной или свойстве;
возвращаются или выбрасываются;
передаются в качестве аргумента другой функции;
используются в качестве получателя в вызове или безопасном вызове;
проверяются в условии, например
if,whenилиwhile;используются в качестве последнего оператора лямбда-выражения.
Проверка не сообщает об игнорируемых результатах операций инкремента, таких как ++ и --, а также логических операций с сокращённым вычислением, в которых правая часть завершает текущую функцию, например condition || return.
С помощью проверки неиспользуемых возвращаемых значений можно находить ошибки, при которых вызов функции выдаёт значимый результат, но этот результат незаметно отбрасывается. Это помогает предотвратить неожиданное поведение и упрощает поиск таких проблем.
Вот пример, в котором создаётся строка, но она нигде не используется, поэтому проверка сообщает об игнорируемом результате:
fun formatGreeting(name: String): String {
if (name.isBlank()) return "Hello, anonymous user!"
if (!name.contains(' ')) {
// The checker reports a warning that this result is ignored:
// "Unused return value of 'plus'."
"Hello, " + name.replaceFirstChar(Char::titlecase) + "!"
}
val (first, last) = name.split(' ')
return "Hello, $first! Or should I call you Dr. $last?"
}
Настройка проверки неиспользуемых возвращаемых значений
Вы можете управлять тем, как компилятор сообщает об игнорируемых результатах, с помощью параметра компилятора -Xreturn-value-checker.
Он поддерживает следующие режимы:
disableотключает проверку неиспользуемых возвращаемых значений (по умолчанию).checkвключает проверку и сообщает о предупреждениях для игнорируемых результатов помеченных функций.fullвключает проверку, считает все функции в проекте помеченными и сообщает о предупреждениях для игнорируемых результатов.
Чтобы использовать проверку неиспользуемых возвращаемых значений в проекте, добавьте параметр компилятора в файл конфигурации сборки:
// build.gradle(.kts)
kotlin {
compilerOptions {
freeCompilerArgs.add("-Xreturn-value-checker=check")
}
}
<!-- pom.xml -->
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
..
<configuration>
<args>
<arg>-Xreturn-value-checker=check</arg>
</args>
</configuration>
</plugin>
Пометка функций для проверки игнорируемых результатов
Если задать параметр компилятора -Xreturn-value-checker равным check, проверка будет сообщать об игнорируемых результатах только для помеченных выражений, как это сделано для большинства функций стандартной библиотеки Kotlin.
Чтобы пометить собственный код, используйте аннотацию @MustUseReturnValues. Её можно применить к файлу, классу или функции в зависимости от области, которую должна охватывать проверка.
Например, можно пометить весь файл:
// Marks all functions and classes in this file so the checker reports unused return values @file:MustUseReturnValues package my.project fun someFunction(): String
Или отдельный класс:
// Marks all functions in this class so the checker reports unused return values
@MustUseReturnValues
class Greeter {
fun greet(name: String): String = "Hello, $name"
}
fun someFunction(): Int = ...
Отключение сообщений об игнорируемых результатах
Чтобы отключить сообщения для определённых функций, аннотируйте их с помощью @IgnorableReturnValue. Аннотируйте функции, для которых игнорирование результата является обычным и ожидаемым поведением, например MutableList.add:
@IgnorableReturnValue
fun <T> MutableList<T>.addAndIgnoreResult(element: T): Boolean {
return add(element)
}
Можно отключить предупреждение, не аннотируя саму функцию. Для этого присвойте результат специальной безымянной переменной, используя синтаксис с подчёркиванием (_):
// Non-ignorable function
fun computeValue(): Int = 42
fun main() {
// Reports a warning: result is ignored
computeValue()
// Suppresses the warning only at this call site with a special unused variable
val _ = computeValue()
}
Игнорируемые результаты в переопределениях функций
При переопределении функции переопределение наследует правила выдачи сообщений, заданные аннотациями базового объявления. Это также относится к случаям, когда базовое объявление входит в стандартную библиотеку Kotlin или другие библиотечные зависимости, поэтому проверка сообщает об игнорируемых результатах для переопределений таких функций, как Any.hashCode().
Кроме того, нельзя переопределить функцию, помеченную @IgnorableReturnValue, другой функцией, которая требует использовать возвращаемое значение. Однако можно пометить переопределение аннотацией @IgnorableReturnValue в классе или интерфейсе, аннотированном @MustUseReturnValues, если его результат можно безопасно игнорировать:
@MustUseReturnValues
interface Greeter {
fun greet(name: String): String
}
object SilentGreeter : Greeter {
@IgnorableReturnValue
override fun greet(name: String): String = ""
}
fun check(g: Greeter) {
// Reports a warning: unused return value
g.greet("John")
// No warning
SilentGreeter.greet("John")
}
Проверка неиспользуемых результатов в функциях высшего порядка
Некоторые функции высшего порядка, например функция области видимости let, возвращают результат лямбда-выражения. Чтобы проверять неиспользуемые результаты лямбда-выражений в функциях высшего порядка, добавьте контракт returnsResultOf(), имеющий статус экспериментального, в контракт функции.
Вот пример:
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
@OptIn(ExperimentalContracts::class)
inline fun <T, R> T.customLet(block: (T) -> R): R {
contract {
returnsResultOf(block)
}
return block(this)
}
Затем можно использовать функцию с таким контрактом, например .customLet(), чтобы проверить, используется ли результат лямбда-выражения:
fun handleNullablePackageName(packageName: String?, builder: StringBuilder) {
// The checker doesn't report a warning because the return value of append() can be ignored
packageName?.customLet { builder.append(it) }
// The checker reports a warning because the returned string is unused
packageName?.customLet { "kotlin.$it" }
}
Чтобы включить его использование в проекте, добавьте следующий параметр компилятора в файл сборки:
// build.gradle(.kts)
kotlin {
compilerOptions {
freeCompilerArgs.add("-Xallow-returns-result-of")
}
}
<!-- pom.xml -->
<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<configuration>
<args>
<arg>-Xallow-returns-result-of</arg>
</args>
</configuration>
</plugin>
</plugins>
</build>
Совместимость с аннотациями Java
Некоторые библиотеки Java используют похожие механизмы с другими аннотациями. Проверка неиспользуемых возвращаемых значений считает следующие аннотации эквивалентными использованию @MustUseReturnValues:
Она также считает аннотацию com.google.errorprone.annotations.CanIgnoreReturnValue эквивалентной использованию @IgnorableReturnValue.
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/unused-return-value-checker.html