是否应该避免在Kotlin中命名与现有类相同的功能? 为什么?

Kotlin允许命名与现有类相同的函数,例如,具有初始化函数的HashSet可以像这样实现:

 fun <T> HashSet(n : Int, fn: (Int) -> T) = HashSet<T>(n).apply { repeat(n) { add(fn(it)) } } 

使用时,它看起来像一个正常的HashSet构造函数:

 var real = HashSet<String>() var fake = HashSet(5) { "Element $it" } 

这应该避免或鼓励,为什么?

正如在有关命名风格的文档中所述:

如果有疑问,请默认Java代码约定,例如:

  • 方法和属性以小写开头

避免命名与类相同的功能的一个强有力的理由是,它可能会混淆后面将使用它的开发者,因为违背了他们的期望:

  • 该函数将不可用于超级构造函数调用(如果该类是open
  • 它不会通过反射作为构造函数来显示
  • 它将不能用作Java代码中的构造函数( new HashSet(n, it -> "Element " + it)是一个错误)
  • 如果你想稍后改变实现并返回一些子类实例,它会变得更混乱, HashSet(n) { "Element $it" }将不会构造HashSet但是,例如LinkedHashSet

为了避免这种混淆,最好明确地说明它是一个工厂函数而不是构造函数。

在stdlib中通常也可以避免命名与类相同的函数。 给定SomeClass ,在stdlib中,工厂函数的首选命名风格是someClassOfsomeClassBy或其他解释函数的最佳语义。 例子:

  • generateSequence { ... }sequenceOf(...)
  • lazy { ... }lazyOf(...)
  • compareBy { ... }
  • listOf(...)listOf(...)setOf(...) mapOf(...)

所以,应该有一个强有力的理由来有一个功能模仿一个构造函数。

相反,函数的名称可能会告诉用户更多(甚至是全部)关于它的用法。

我同意+热键。 在这种情况下最好避免混淆。

如果只是在内部使用,而其他所有的开发者(如果有的话)都可以,但是我会说要去做。 Python承认这个想法,我喜欢它。 哎呀,他们是双向的,如果你觉得它更像是一个函数,你也可以在函数的情况下命名一个类。 但是,Python不必处理Java互操作,所以绝对不要用于公共代码。