我有以下代码:
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)}
请指教。非常感谢你!
答案 0 :(得分:2)
是的,你可以这样做,但在你去文档之前,检查一下从不同的线程使用相同的Metaphone
类实例是否安全。
此课程为
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
}
}