Mało znane słowa kluczowe – strictfp
Jednym z założeń jakie przyjęli twórcy języka java była niezależność od platformy. Mamy bytecode mamy JVM-kę i jedziemy. Rzecz w tym, że we wczesnych wersjach języka wszelkie obliczenia zmiennoprzecinkowe, te na float i double, odbywały się zgodnie z normą IEEE 754 co powodowało błędy na platformach, które sobie nie radziły z tym standardem. Zatem w Javie 1.2 wprowadzono nowe słówko kluczowe strictfp i jednocześnie uwolniono dotychczasowe obliczenia od konieczności przestrzegania standardu. W efekcie na niektórych platformach stało się możliwe dokonanie pewnych optymalizacji poprzez wykorzystanie np. możliwości leżących w architekturze procesorów. Oczywiście jeżeli gdzieś pojawi się to słowo kluczowe w kodzie to wracamy do punktu wyjścia i musimy rozumieć jak działają obliczenia zgodne z IEEE 754 na danej platformie.
Jak to działa?
Zasada działania jest prosta. Możemy określić dwa zakresy działania słowa strictfp. Pierwszy na poziomie metody:
Listing 1. Zakres na poziomie metody
class MyEntity{
private strictfp float add(float a, float b){
return a + b;
};
}
Drugi na poziomie klasy (interfejsu):
Listing 2. Zakres na poziomie klasy
strictfp class MyEntity{
private float add(float a, float b){
return a + b;
};
}
Wszystkie obliczenia wykonywane w ramach zakresu będą zgodne z IEEE. Wszystkie oznacza w tym przypadku m.in. statyczne inicjalizatory, konstruktory, inicjowanie zmiennych.
I tu bardzo ważna uwaga. Wszystkie obliczenia wykonywane w czasie kompilacji, czyli np. wyznaczanie wartości stałej, są traktowane jako zgodne z IEEE. Przykładowo:
Listing 3. Przykładowe obliczenia traktowane jak strictfp
class MyEntity{
private static final double RING_LEN = Math.PI * 2 * 1.5;
}
stała RING\_LEN zostanie wyliczona w trakcie kompilacji, a obliczenia zostaną przeprowadzone zgodnie z IEEE. Oznacza to też, że np. wartości podane w adnotacjach jako wyliczane/znane w czasie kompilacji będą traktowane zgodnie z IEEE.
Gdzie to może mieć znaczenie?
W sumie nie spotkałem się z praktycznym zastosowaniem tego rozwiązania, ale jestem wstanie wyobrazić przypadek kiedy zależy nam na tym by wraz ze zmianą platformy zachowane zostały błędy obliczeń. Po co? Ponieważ jeżeli znamy zasady obliczeń i wiemy jakie błędy będą popełnione to możemy wprowadzić poprawkę.
Jednak po prawdzie, to mało kto potrzebuje tego słówka.