包在kotlin保护替代
在java中,我们使用了包(protected)作为默认的修饰符,它允许在一个包中包含许多类,但只公开很少的类并保持逻辑封装。
与kotlin似乎并非如此,如果我想有几个其他类应该是彼此可见,但不能进一步我不得不使用私人修改,这限制了一个文件的可见性…所以基本上,如果你有10在一个包中的类,只有其中的一个是公开的,现在你将拥有一个包含所有类的庞大文件(并且在整个地方都是private
的)。
这是正常的做法还是有一种方法来实现kotlin中的一些类似的模块化?
我不明白他们是否有包的概念为什么他们摆脱包保护访问…
与Java相比,Kotlin似乎更少依赖于软件包模型(例如,目录结构不受软件包限制)。 相反,Kotlin提供了internal
可视性 ,这是为模块化项目体系结构设计的。 使用它,你可以将你的代码的一部分封装在一个单独的模块中 。
所以,可以使用顶层声明
-
private
限制文件的可见性 -
internal
限制对模块的可视性
在这一点上,没有其他选择可见性限制。
正如@hotkeys指出的那样,您可以在模块中使用internal
关键字。 我通常使用eclipse和maven,创建这些模块对我来说是不实际的。
也许对于不同的IDEA或Gradle技术堆栈更实用; 我不知道,因为我从来没有用过它们。
另一种选择是将一个包的所有类放在一个文件中。 这并不总是实用或优雅。
对于我来说, package
可见性对其文档价值非常有帮助。 我想知道一些软件包提供给项目其余部分的公共接口。 我想隐藏工厂实现类等等。
所以,即使有可能在Java中破解包私有的类和方法,我仍然喜欢使用package
关键字。
我所做的是用一个注释创建一个项目:
package com.mycompany.libraries.kotlinannotations; import static java.lang.annotation.ElementType.CONSTRUCTOR; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.SOURCE; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; @Documented @Retention(SOURCE) @Target({ TYPE, METHOD, CONSTRUCTOR }) /** * Use in Kotlin code for documentation purposes. * * Whenever a Kotlin class or method is intended to be accesible at package level only. * */ public @interface PackagePrivate { }
然后我可以在任何Kotlin项目中使用这个注释。
第二步,我还没有到处去,我想在某些时候做的是创建一个PMD规则来执行这个maven(或任何其他构建工具),也能够看到在我的IDE中使用pmd插件违反了规则。
目前Kotlin还不是pmd支持的语言之一(也就是拥有自己的模块)。 但是,PMD正在积极发展,Kotlin的知名度正在上升,所以有一定的可能性。 这只是我最好的猜测。