Предупреждение о нативном изменяемом поле

Что означает это предупреждение? Есть ли способ избежать этого предупреждения? Я пытался понять сообщение из кода компилятора, но не смог.

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 будет постоянно приводить к одному и тому же значению.

Другие вопросы по тегам