2016-08-30 2 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 

он прекрасно работает, но так ли это безопасно или, может быть, есть некоторые недостатки, о сохраняющем состоянии implicits?

+0

В вашем примере у вас нет какого-либо изменчивого состояния, поэтому, я думаю, вы в безопасности. Вещи, вероятно, были бы разными, если бы государство было изменчивым. Сказав это, «неявный» - это просто способ заставить компилятор предоставить вам параметр, а не явно указывать его. Любые связанные с государством недостатки, вероятно, будут больше связаны с изменчивостью, чем с имплицитом. Единственная проблема, которую я вижу, заключается в том, что неявное делает зависимость от некоторого состояния более неясной (читая только код использования, который вы не знаете, что это зависит от MyClass). –

ответ

1

отслеживание состояния неявных параметров

Я не уверен, что вы подразумеваете под «состоянием»: изменяемое или неизменным состоянием? Неизменное состояние - все в порядке; константы не опасны.

Мощное состояние было бы намного опаснее. Я не уверен, что ваш вариант использования, но вы могли бы вообще забыть о многопоточности (потому что вы никогда не знаете, запущена ли какая-либо другая функция в качестве неявного и использует ее в другом потоке ...). Вы также не можете рассуждать о своем коде, поскольку неявное разрешение является сложным и по определению не может быть прочитано в коде (потому что это не так, но явное).

Смежные вопросы