java 如何从SpreadOperator中删除Detekt在使用Sping Boot 时给出的性能警告?

qij5mzcb  于 2023-04-28  发布在  Java
关注(0)|答案(5)|浏览(101)

最近,我在应用程序中添加了Detekt分析器。
在我运行detekt(./gradlew detekt),我得到了SpreadOperator警告在我的主要类的应用程序。
代码警告:runApplication<MessCallsApplication>(*args)
您可以在此处阅读有关SpreadOperator警告的信息:SpreadOperator Warning
我的主要课程:

@SpringBootApplication(exclude = [RedisAutoConfiguration::class])
@EnableCircuitBreaker
@EnableScheduling
class MyApplication {

    companion object : KLogging()
}

fun main(args: Array<String>) {
    Thread.setDefaultUncaughtExceptionHandler { _, exception ->
        MessCallsApplication.logger.error(exception) { "Uncaught exception" }
    }

    runApplication<MessCallsApplication>(*args)
}

问题是,摆脱SpreadOperator警告的最佳实践是什么?还是不可能?

tjjdgumg

tjjdgumg1#

在你的特殊情况下:

runApplication<MessCallsApplication>(args = args)

编辑:
这个detekt警告不再是一个案例:https://github.com/detekt/detekt/pull/3157
然而,正如Klitos Kyriacou在代码中提到的-这个数组被复制(甚至两次!)。反编译的字节码:

public final class MessCallsApplicationKt {
   public static final void main(@NotNull String[] args) {
      Intrinsics.checkNotNullParameter(args, "args");
      Schedulers.enableMetrics();
      String[] args$iv = (String[])Arrays.copyOf(args, args.length);
      int $i$f$runApplication = false;
      Intrinsics.checkExpressionValueIsNotNull(SpringApplication.run(MessCallsApplication.class, (String[])Arrays.copyOf(args$iv, args$iv.length)), "SpringApplication.run(T::class.java, *args)");
   }
}
3j86kqsm

3j86kqsm2#

你可以在表达式前面加上@Suppress("SpreadOperator"),如下所示:

@SpringBootApplication(exclude = [RedisAutoConfiguration::class])
@EnableCircuitBreaker
@EnableScheduling
class MyApplication {

    companion object : KLogging()
}

fun main(args: Array<String>) {
    Thread.setDefaultUncaughtExceptionHandler { _, exception ->
        MessCallsApplication.logger.error(exception) { "Uncaught exception" }
    }
    @Suppress("SpreadOperator")
    runApplication<MessCallsApplication>(*args)
}
qmelpv7a

qmelpv7a3#

或者简单地从以下更改:

fun main(args: Array<String>)

fun main(vararg args: String)
fdbelqdn

fdbelqdn4#

你必须把 * 传递给run方法:

fun main(vararg args: String) {
  runApplication<RateRefresherApplication>(*args)
}
xxe27gdn

xxe27gdn5#

我在一个函数调用中这样做:

private fun combine(vararg messages: String){ . . . }

...

//elsewhere
combine(*messages)

在我的特殊情况下,将this的签名更改为以下是有意义的(因为它旨在处理来自另一个函数的vararg,而不是接受逗号分隔的列表本身)。
这将使用vararg参数作为数组,而不是将其转换为另一个变量参数:

private fun combine(messages: Array<out String>){ . . . }

...

//elsewhere
combine(messages) // now can remove spread operator

相关问题