Означает ли объявление Java-класса strictfp, что методы, которые он вызывает в других классах, также являются строгими?
Что касается заголовка... если класс X объявлен строгим и вызывает методы класса Y, будет ли соблюдена строгость, или это применимо только к собственному коду X?
Кроме того, если я вычислю значение в методе класса strictfp и передам его в метод не строгого fp, останется ли значение "безопасным", если с ним не будет выполнено никаких дальнейших вычислений?
3 ответа
Насколько я понимаю strictfp
ограничено областью, отмеченной этим ключевым словом. Это означает, что это делает вычисления отмеченного класса или метода переносимыми.
Он не может распространить эффект на ссылочный код. Например, если foo()
является strictfp
но это вызывает bar()
от какого-то другого класса, который не strictfp
, расчеты внутри bar()
не будет переносимым, но вычисления внутри foo()
будет. Итак, если результаты bar()
используются в foo()
общий результат может быть не переносимым.
public strictfp double foo() {
return bar() * 3.1415926;
}
public double bar() {
return 2.718281828 * 2.0;
}
Этот результат 2.718281828 * 2.0
не является переносимым, но его умножение на 3.1415926
является.
Эффект модификатора strictfp заключается в том, чтобы все выражения с плавающей запятой или двойные выражения в объявлении класса (в том числе в инициализаторах переменных, инициализаторах экземпляров, статических инициализаторах и конструкторах) были явно строчными FP.
[мой акцент]
Это относится только к выражениям в методах, объявленных в этом классе.
Из статьи jGuru Для чего нужен модификатор strictfp ? Когда я рассмотрю возможность его использования?:
strictfp
Ключевое слово может применяться как к классам, так и к методам. Для классов (и интерфейсов) это указывает, что все выражения во всех методах класса строго FP.
Чтобы ответить на ваш второй вопрос: да, значение с плавающей запятой будет "безопасным", если оно больше не подлежит дальнейшим вычислениям, так как strictfp
применяется только к выражениям.
Связанный: Когда я должен использовать ключевое слово "strictfp" в Java?