2014-11-08 3 views
2

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

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. 

ответ

2

Это просто напоминание о том, что значение Java может измениться в течение всего срока программы, но вы, программист, предположим его де-факто неизменность, используя эти обозначения.

Фактически, можно переназначить эти поля на уровне Java. В этом случае код Фреге мог бы вернуть прежнее значение, которое он может где-то кэшировать. Или это может нарушить ссылочную прозрачность, так что sysin не означает одно и то же везде.

Если вам нужно убедиться, что вы получили текущее значение изменяемого поля, вам необходимо объявить его как IO или ST.

Эта функция считается, как облегчение для тех случаев, когда мы знаем, что значение не изменится, так что мы можем написать:

dosomething sysin 

вместо

sysin >>= dosomething 

Это используется , например, в frege.java.IO, где, stdout и stderr определены таким образом.

Предупреждение нельзя подавить, кроме как путем компиляции с nowarn. Эта функция просто не должна использоваться, если вы абсолютно не уверены, что делаете правильные вещи, то есть, когда правильное действие IO или ST будет вызывать одинаковое значение все время.

+0

Отлично! Благодаря! Было бы полезно, если мы обновим предупреждающее сообщение, чтобы это стало ясно? –

+0

Я всегда благодарен за вклад в этом отношении, как вы, вероятно, знаете, дорогой @MarimuthuMadasamy. Пожалуйста, предложите что-нибудь! – Ingo

+0

Запросить запрос! :) –

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