2010-09-23 59 views
1

我写了一个名为Cache [A,B]的Scala特性来提供一个缓存API。该缓存具有以下方法:asyncGet(),asyncPut(),asyncPutIfAbsent(),asyncRemove()。我将要有几个静态方法,比如getOrElseUpdate(key:A)(op:=> B)。我不希望这样的方法在Cache特性中被抽象定义,因为我不希望每个Cache实现都必须为它提供一个实现,当它可以使用async *()方法写入一次时。在斯卡拉,公共静态方法的容器的复数对象名称?

在查看Google Guava和Java库的某些部分时,他们将公共静态函数放在一个接口名称复数的类中,所以“Caches”就是我会用到的名称。

实际上我喜欢这个命名方案,尽管我可以使用Cache伴侣对象。在我的很多代码中,我的许多伴侣对象都包含私有的val或def,因此我的API的用户需要查看伴随对象,看看他们可以从那里使用什么,或者是什么。

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

那么人们会怎么想?

回答

10

Scala的特征不仅仅是Java接口的不同名称。他们可能有具体(实施)的成员,这两个值(val和var)和方法。所以如果有一个方法的统一/通用/共享的实现,它可以放在一个特性中,不需要复制或分解到一个单独的类中。

+0

你说得对。它不会工作。看起来静态方法中的Java代码是以某种方式“促进”某个对象的,例如,说它是不可变的,用别的东西来链接它,而不是调用本来是常规方法的东西。因此,我将#getOrElseUpdate()放入可以混合到具体Cache实现中的单独特征中。 – 2010-09-23 19:05:51

3

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

+0

好,好点。看到我对兰德尔的回应的评论。花太多时间看Java代码:) – 2010-09-23 19:08:03