Spec-Zone.ru › Kotlin 2

Проверка неиспользуемых возвращаемых значений

В будущих выпусках Kotlin эта функция планируется к стабилизации и улучшению. Мы будем признательны за ваши отзывы в нашем трекере задач YouTrack.

Дополнительную информацию см. в соответствующем предложении KEEP.

Проверка неиспользуемых возвращаемых значений позволяет обнаруживать игнорируемые результаты. Это значения, возвращаемые выражениями, которые дают результат, отличный от 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 = ...

Проверку можно применить ко всему проекту, задав параметру компилятора -Xreturn-value-checker значение full. В этом случае не нужно аннотировать код с помощью @MustUseReturnValues.

Отключение сообщений об игнорируемых результатах

Чтобы отключить сообщения для определённых функций, аннотируйте их с помощью @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(), имеющий статус экспериментального, в контракт функции.

Контракты Kotlin являются экспериментальными. Чтобы включить их использование, добавьте аннотацию @OptIn(ExperimentalContracts::class) при объявлении функции с контрактом.

Вот пример:

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" }
}

Для использования контракта returnsResultOf() необходимо включить отдельный параметр компилятора. Учтите, что при его использовании создаются предварительные бинарные файлы, которые не могут быть прочитаны версиями компилятора Kotlin до 2.4.0.

Чтобы включить его использование в проекте, добавьте следующий параметр компилятора в файл сборки:

// 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.CheckReturnValue

  • edu.umd.cs.findbugs.annotations.CheckReturnValue

  • org.jetbrains.annotations.CheckReturnValue

  • org.springframework.lang.CheckReturnValue

  • org.jooq.CheckReturnValue

Она также считает аннотацию com.google.errorprone.annotations.CanIgnoreReturnValue эквивалентной использованию @IgnorableReturnValue.

10 сентября 2026 г.
Перегрузка операторовКлассы

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API