Search code examples
javakotlingradlejvm

How to convert between JvmTarget and JavaVersion?


Within my project I need to assign the JVM version as different types:

In order to keep the project maintainable I like to define the JVM version in a single place. Hence, I would like to either (1) convert between the different types or (2) to create both a JvmTarget instance and a JavaVersion instance from an integer.

Pseudo code (1)

JvmTarget.fromInteger(11) // JvmTarget.JVM_11
JavaVersion.fromInteger(11) // JavaVersion.VERSION_11

In the JvmTarget class fromTarget(String) already exists.

Pseudo code (2)

JvmTarget.ofJavaVersion(JavaVersion.VERSION_11) // JvmTarget.JVM_11
JavaVersion.ofJvmTarget(JvmTarget.JVM_11) // JavaVersion.VERSION_11

Solution

  • As well as having JvmTarget.fromTarget() which accepts a string, we have JavaVersion.toVersion() which accepts a Java Object, which can be either an integer or a string1.

    So to define both from an integer you can do:

    val javaVersionSetting = 21
    val jvmTarget = JvmTarget.fromTarget(javaVersionSetting.toString())
    val javaVersion = JavaVersion.toVersion(javaVersionSetting)
    

    Or from a string, which doesn't involve any conversion of basic types:

    val javaVersionSetting = "21"
    val jvmTarget = JvmTarget.fromTarget(javaVersionSetting)
    val javaVersion = JavaVersion.toVersion(javaVersionSetting)
    

    1And if you want three for a party someday, there is also JavaLanguageVersion.of() from Gradle's Java toolchains which has overloads accepting an integer or a string.