Scala:実用新機能のシングルトン -- scala フィールド と apache-spark フィールド と singleton フィールド 関連 問題

Scala: singleton in an utility function












0
vote

問題

日本語

次のコードがあります。

<事前> <コード> 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 } }

上記のコードは大丈夫ですが、これが十分に良いプログラミング練習であるかどうか疑問に思いますか? MetaphonerをMytilityにシングルトン/静的にする必要がありますか? BTW、このユーティリティはスパークジョブで呼ばれます、すなわち。

<事前> <コード> val output = input.map { t => MyUtility.metaphoneKey(t)}

アドバイスしてください。ありがとうございました!

英語

I have the following code:

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       }     } 

The above code works fine, but I am wondering if this is a good enough programming practice? Should I make the metaphoner a singleton/static in MyUtility? BTW, this utility will be called in a Spark job, i.e.

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

Please advice. Thank you very much!

</div
        

回答リスト

2
 
vote

はい、あなたはそれを行うことができますが、ドキュメントに進む前に、同じ Metaphone クラスインスタンスをさまざまなスレッドから使​​用しても安全な場合は確認してください。

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

このクラスは conditionally thread-safe です。インスタンスフィールドMAXCODELEN mutable setmaxcodelen(int)ですが、揮発性ではなく、アクセスは 同期していません。クラスのインスタンスが間間共有されている場合 スレッド、呼び出し側は適切な同期が確実にあることを確認する必要があります。 スレッド間の価値の安全な出版を確実にし、 初期設定後にsetMaxcodelen(int)を呼び出しません。

あなたのケースに適用されているかどうかを確認してください...

 

Yes, you can do it, but before you should go to documentation and check if it's safe to use same Metaphone class instance from different threads.

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

This class is conditionally thread-safe. The instance field maxCodeLen is mutable setMaxCodeLen(int) but is not volatile, and accesses are not synchronized. If an instance of the class is shared between threads, the caller needs to ensure that suitable synchronization is used to ensure safe publication of the value between threads, and must not invoke setMaxCodeLen(int) after initial setup.

Check if it's applied for your case ...

</div
 
 
 
 
1
 
vote

シングルトンユーティリティクラスを使用してこれを行うことができますが、ケースクラスの使用を検討します。これを達成するためにグローバルユーティリティクラスを使用する理由を自分自身に尋ねなければなりません。ケースクラスはスレッドセーフで、マッチングで使用できます。

また、クラス設計を考慮すると、厳密に名前付きのクラスは汎用ユーティリティクラスよりも強い読みやすさを提供します。

<事前> <コード> 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 } }
 

While you could use a singleton utility class to do this, I'd consider using a case class. You have to ask yourself the reason for using a global utility class to accomplish this. The case class is thread-safe and can be used in matching.

Also, when considering class design, a strongly named class delivers stronger readability than a general purpose utility class.

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   } } 
</div
 
 
     
     

関連する質問

3  NETのシングルトンパターンは不可能ですか?  ( Singleton pattern in net is not possible ) 
私は非常に興味深い状況を持っています、私はシングルトンパターンが.NETフレームワーク(任意のバージョン)でシングルトンパターンがすべて不可能であることを考え出しました。 このコードを下回る <事前> <コード> namespace SingletonPatt...

10  なぜ私たちは«ロガー»クラスをシングルトンとして考えるべきですか?  ( Why we should consider the logger class as a singleton ) 
私たちはすべてログについて知っています。通常の非 Singletonクラスのクラスとそれを作るとどうなりますか? ...

10  SmallTalk Singleton Pattern:インスタンス変数を初期化する方法  ( Smalltalk singleton pattern how do i initialize the instance variables ) 
シングルトンパターンを取得するのに問題があり、SmallTalkでインスタンス変数を初期化します。 (これは別の実装へのリンク明確化のために) これは私が持っているものです: <事前> <コード> new ^UniqueInstance ifNil: [Un...

2  PHPのインスタンスにオブジェクトを追加する  ( Add objects to an instance in php ) 
イントロ MVCフレームワークを開発しています、そして私は問題に遭遇しました。それは私が達成しようとしているものがシングルトン設計方法として知られています - クラスの初期化クラスの初期化。できる限りコントローラ "Acontroller" の中のコードより...

6  ムースのシングルトンの役割  ( Singleton roles in moose ) 
PerlとMooseを使ってシングルトンの役割を書き込もうとしています。私はMoosex :: Singletonモジュールが利用可能ですが、プロジェクトのための別のCPANモジュールが必要な場合は常に抵抗があります。これを試して、私の方法が機能していない理...

12  Rubyでシングルトンデザインパターンを使用してクラスを作成するにはどうすればよいですか。  ( How do i create a class using the singleton design pattern in ruby ) 
シングルトンパターンは、クラスのインスタンス化を1つのオブジェクトインスタンスに制限するために使用されるデザインパターンです。 C ++とJavaでシングルトンパターンのコーディング方法を知っていますが、誰かがRubyに実装する方法を知っているかどうか疑問に思...

9  私の工場のシングルトンの上のIOCの利益  ( Benefit of ioc over my factory singleton ) 
シングルトンの使用に関して汚名があるようです。私は個人的に購入したことがないが、心をオープンにしているために、私は私の日常の仕事に率直に退屈していて、違うものを試してみたいので、私はIOCの概念を代替として試してみることを試みています。 IOCの概念の解釈が間...

31  シングルトンモデルの実装方法  ( How to implement a singleton model ) 
私はレールにサイトを持っており、サイト全体の設定をしたいです。特定のイベントが発生した場合、アプリの一部はSMSによって管理者に通知できます。これは、サイト全体の設定で設定可能な機能の例です。 だから私は設定モデルか何かを持っているべきだと思っていました。 S...

2  シングルトンの実装は32ビットではなく64ビットではありません  ( Singleton implementation works fine on 32 bit but not 64 bit ) 
シングルトンを介してアクセスされる共有オブジェクトを含むアプリケーションに取り組んでいます。ただし、64ビットでは32ビットでうまく機能していますが、正しくロックされているようです。私のオブジェクトのコンストラクタで、私はいくつかのConfig Regキーをチ...

8  シングルトンを複数回インスタンス化する方法?  ( How to instantiate a singleton multiple times ) 
私は私のコードにシングルトンが必要です。私はそれをJavaに実装し、うまく機能します。私がそれをやった理由は、Mulitple環境では、このクラスのインスタンスが1つしかないことを確認することです。 しかし今、私は単体テストで私のシングルトンオブジェクトをロー...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有