2016-08-30 11 views
1

コンパイラはすべての暗黙的な暗黙を推論するので、ステートフルな暗黙のパラメータを持つことは安全ですか?例えば:ステートフルな暗黙のパラメータ。それは安全ですか?

class TestImplct { 
    def test(implicit mc : MyClass) = println(mc.i) 
} 

class MyClass(val i : Int) 

、その後はこの

implicit val mc = new MyClass(1234) 
val ti = new TestImplct 
ti.test 

それが正常に動作しますが、それは安全であるか、多分ステートフル暗黙に関するいくつかの欠点があるので、それを使うのか?

+0

あなたの例では、変更可能な状態がないので、あなたは安全です。状態が変更可能な場合、状況はおそらく異なるでしょう。つまり、「暗黙的」は、明示的に指定するのではなく、コンパイラにパラメータを提供させる方法に過ぎません。状態に関連するあらゆる欠点は、おそらく暗黙的なものよりも、変更可能性に関連しているでしょう。私が見ている唯一の問題は、暗黙的に、(MyClassに依存していることに気づいていない使用コードだけを読むことによって)いくつかの状態への依存をより曖昧にすることです。 –

答えて

1

ステートフル暗黙のパラメータ

私は、あなたが「ステートフル」によって何を意味するかわからない:可変または不変状態? 不変の状態は大丈夫です。定数は危険ではありません。

ただし、変更可能な状態ははるかに危険です。私はあなたのユースケースが何であるか分かりませんが、一般的にマルチスレッドについては忘れてしまいます(実行中の他の関数が暗黙的に実行されていて、別のスレッドで使用しているかどうかはわかりません)。 暗黙的な解決は複雑で定義上コードでは読み取れないため(暗黙的な解決は複雑で明示的ではないため)、あなたのコードを推論することも不可能になります。

関連する問題