Scala:实用函数中的单例

时间:2016-02-10 17:28:55

标签: scala apache-spark singleton

我有以下代码:

import org.apache.commons.codec.language.Metaphone;

    object MyUtility {

      def metaphoneKey(data: DataClass): String = {

        val metaphoner = new Metaphone
        val field1 = metaphoner.encode(data.getField1)
        val field2 = metaphoner.encode(data.getField2)
        field1 + "_" + field2
      }
    }

上面的代码工作正常,但我想知道这是否是一个足够好的编程实践?我应该在MyUtility中使变形金刚成为单身/静态吗?顺便说一下,这个实用程序将在Spark作业中调用,即

 val output = input.map { t => MyUtility.metaphoneKey(t)}

请指教。非常感谢你!

2 个答案:

答案 0 :(得分:2)

是的,你可以这样做,但在你去文档之前,检查一下从不同的线程使用相同的Metaphone类实例是否安全。

http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/language/Metaphone.html

  

此课程为conditionally thread-safe。实例字段maxCodeLen   是可变的setMaxCodeLen(int)但不是易失性的,访问是   不同步。如果在类之间共享类的实例   线程,调用者需要确保适当的同步   用于确保线程之间安全发布值,并且必须   初始设置后不调用setMaxCodeLen(int)。

检查它是否适用于您的情况......

答案 1 :(得分:1)

虽然您可以使用单例实用程序类来执行此操作,但我会考虑使用案例类。您必须问自己使用全局实用程序类来实现此目的的原因。案例类是线程安全的,可以用于匹配。

此外,在考虑类设计时,强名称类比通用实用类具有更强的可读性。

import org.apache.commons.codec.language.Metaphone;

case class MetaphoneKey(data: DataClass) {
  lazy val field: String = {
    val metaphoner = new Metaphone
    val field1 = metaphoner.encode(data.getField1)
    val field2 = metaphoner.encode(data.getField2)

    field1 + "_" + field2
  }
}