Предупреждение о нативном изменяемом поле
Что означает это предупреждение? Есть ли способ избежать этого предупреждения? Я пытался понять сообщение из кода компилятора, но не смог.
frege> native sysin "java.lang.System.in" :: InputStream
native function sysin :: InputStream
3: note that the java expression
java.lang.System.in is supposed to be
constant.
Я также попробовал код ниже, но получил то же самое предупреждение:
frege> native sysin "java.lang.System.in" :: MutableIO InputStream
native function sysin :: MutableIO InputStream
3: note that the java expression
java.lang.System.in is supposed to be
constant.
1 ответ
Это просто напоминание о том, что значение java может изменяться в течение всего времени жизни программы, но вы, программист, допускаете его фактическую неизменность с помощью этой записи.
Фактически, эти поля можно переназначить на уровне Java. В этом случае код Фреге все еще может вернуть предыдущее значение, которое он мог где-то кэшировать. Или это может нарушить ссылочную прозрачность, так что sysin
не означает, что везде одинаково.
Если вам нужно убедиться, что вы получаете текущее значение изменяемого поля, вам нужно объявить его как IO или ST.
Эта функция рассматривается как облегчение для случаев, когда мы знаем, что значение не изменится, поэтому мы можем написать:
dosomething sysin
вместо
sysin >>= dosomething
Это используется, например, в frege.java.IO
, где stdin
, stdout
а также stderr
определены таким образом.
Предупреждение не может быть подавлено, кроме как путем компиляции с nowarn. Эту функцию просто не следует использовать, если вы абсолютно не уверены, что делаете правильно, то есть, когда правильное действие IO или ST будет постоянно приводить к одному и тому же значению.