在Scala中,公共静态方法容器的多个对象名称?

时间:2010-09-23 00:42:51

标签: scala

我编写了一个名为Cache [A,B]的Scala特征来提供缓存API。 Cache有以下方法,asyncGet(),asyncPut(),asyncPutIfAbsent(),asyncRemove()。

我将有一些静态方法,例如getOrElseUpdate(key:A)(op:=> B)。我不希望像Cache这样的方法作为Cache trait中的抽象defs,因为我不希望每个Cache实现都必须为它提供一个实现,当它可以使用async *()方法编写一次时。

在查看Google Guava和Java库的一部分时,他们将公共静态函数放在一个接口名称的复数类中,因此“Caches”将是我将使用的名称。

我实际上喜欢这个命名方案,即使我可以使用Cache伴随对象。在查看我的大部分代码时,我的许多伴随对象都包含私有val或def,因此我的API的用户需要查看伴随对象以查看他们可以从那里使用什么,或者任何事情。

通过让一个名为“Caches”的对象与Java一致,并且清楚地表明那里只有公共函数。我倾向于使用“对象缓存”而不是“对象缓存”。

那么人们的想法是什么?

2 个答案:

答案 0 :(得分:10)

Scala的特征不仅仅是Java接口的不同名称。他们可能有具体的(已实现的)成员,包括值(val和var)和方法。因此,如果存在方法的统一/通用/共享实现,则可以将其置于特征中,而无需将其复制或分解为单独的类。

答案 1 :(得分:3)

我认为错误始于“会有一些静态方法”。为什么有静态方法?如果你解释为什么需要静态方法,它将有助于弄清楚设计应该是什么。