优雅的去除 kotlin的类及类成员默认为final的问题


问题

kotlin的类以及成员默认都是final的,因此不能继承final类或者重写final方法,这对于 如 Spring AOP这类大量使用cglib代理实现的框架 很不方便;

当然可以显示声明类或者成员方法为open类型;另一种更为优雅的方式是通过kotlin提供的kotlin-spring 插件即可实现 All-open

通过插件满足 All-open

对于Spring的友好支持

如果你的框架正好是spring, 那么可以直接使用kotlin-spring 插件来完成,更加方便

Gradle

1、可以通过添加 build script dependencies:

buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
    }
}

apply plugin: "kotlin-spring" // instead of "kotlin-allopen"

2、也可以直接使用Gradle plugins DSL:

plugins {
  id "org.jetbrains.kotlin.plugin.spring" version "1.4.32"
}

Maven

kotlin-maven-allopen插件依赖提供了Spring插件支持,因此直接使用即可

<compilerPlugins>
    <plugin>spring</plugin>
</compilerPlugins>

<dependencies>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-maven-allopen</artifactId>
        <version>${kotlin.version}</version>
    </dependency>
</dependencies>

对于非Spring也同样提供支持

当然,对于非spring框架也可以自己指定特定的注解 让其生效

Gradle

1、通过添加 build script dependencies

buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
    }
}

apply plugin: "kotlin-allopen"

2、也可以通过

plugins {
  id "org.jetbrains.kotlin.plugin.allopen" version "1.4.32"
}

然后指定生效的注解:

allOpen {
    annotation("com.my.Annotation")
    // annotations("com.another.Annotation", "com.third.Annotation")
}

这样被注解 com.my.Annotation标注后,类及成员都会被处理成open的

Maven

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>

    <configuration>
        <compilerPlugins>
            <!-- Or "spring" for the Spring support -->
            <plugin>all-open</plugin>
        </compilerPlugins>

        <pluginOptions>
            <!-- Each annotation is placed on its own line -->
            <option>all-open:annotation=com.my.Annotation</option>
            <option>all-open:annotation=com.their.AnotherAnnotation</option>
        </pluginOptions>
    </configuration>

    <dependencies>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-allopen</artifactId>
            <version>${kotlin.version}</version>
        </dependency>
    </dependencies>
</plugin>



相关参考:

kotlin官方文档
final vs open

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏油

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值