包在kotlin保护替代

在java中,我们使用了package的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的知名度正在上升,所以有一定的可能性。 这只是我最好的猜测。