报告使用 IElementType 或其子类型初始化的实例字段。

IElementType 实例代表 IntelliJ 平台的词法分析器/解析器基础架构中的令牌类型,应定义为 static 常量以确保它们为单例。 定义为实例字段时,会为每个类实例创建一个新的 IElementType 实例。 所有此类实例都会注册到 IElementType 内部存储中,并保留在那里,直到应用关闭。 目前,该基础架构仅允许存储约 16000 种元素类型,并不是很多。

该检查建议在 Java 中将实例字段转换为 static 常量,或者在 Kotlin 中将它们移至伴生对象。

错误模式 (Java):


class MyTokens {
  // 为每个 MyTokens 实例创建的新 IElementType
  IElementType myToken = new IElementType("MY_TOKEN");
}

正确模式 (Java):


class MyTokens {
  // 跨所有实例共享的单例 IElementType
  static final IElementType MY_TOKEN = new IElementType("MY_TOKEN");
}

错误模式 (Kotlin):


class MyTokens {
  // 为每个 MyTokens 实例创建的新 IElementType
  val myToken = IElementType("MY_TOKEN")
}

正确模式 (Kotlin):


class MyTokens {
  companion object {
    // 跨所有实例共享的单例 IElementType
    val MY_TOKEN = IElementType("MY_TOKEN")
  }
}

或者在 Kotlin 中,令牌类型可以定义为顶层声明或对象声明:


// 顶层常量
private val MY_TOKEN = IElementType("MY_TOKEN")

// 或者在对象中
object MyTokens {
  val MY_TOKEN = IElementType("MY_TOKEN")
}