Dobre praktyki programistyczne

Kompilacja warunkowa w Java

08.09.2011

Java nie posiada preprocesora, tak jak C. Ale kompilator optymalizuje kod – jeśli jest pewny, że będzie nieosiągalny, nie będzie go w wynikowym kodzie. Opcjonalny kod może być umieszczony w klauzuli if lub przy użyciu operatora „? :”, pod warunkiem, że warunek może być obliczony przez kompilator.

Warunek ma najczęściej postać zmiennej boolean. Musi ona być zadeklarowana jako final i ewentualnie static. Wewnątrz wyrażenia może być kod taki jak w zwykłej klauzuli if. Może to być więc nawet klasa lokalna lub anonimowa, ale nie sama metoda. Spróbuj użyć poniższego kodu. Skompiluj go i zobacz wynikowe klasy, potem zmień wartość zmiennych i sprawdź ponownie.

  1. package eu.standardcode.example;
  2.  
  3. public class ConditionalCompilation {
  4.  
  5. private static final boolean COMPILE_ANONUMOUS = false;
  6. private static final boolean COMPILE_LOCAL = false;
  7. private static final boolean TERTIARY = true;
  8.  
  9. public static void main(String[] args) {
  10. if (COMPILE_ANONUMOUS) {
  11. new Thread(new Runnable() {
  12.  
  13. public void run() {
  14. print("Anonymous");
  15. }
  16. }).start();
  17. }
  18. if (COMPILE_LOCAL) {
  19. class Local implements Runnable {
  20.  
  21. public void run() {
  22. print("Local");
  23. }
  24. }
  25. new Thread(new Local()).start();
  26. }
  27. print(TERTIARY ? "Will be in .class file" : "Only in source code");
  28. }
  29.  
  30. static void print(String msg) {
  31. System.out.println(msg);
  32. }
  33. }

Kiedy zmienne są false, będzie tylko jedna klasa ConditionalCompilation. Kiedy są ustawione na true, będą 2 dodatkowe pliki: ConditionalCompilation$1.class (anonimowa) i ConditionalCompilation$1Local.class (lokalna). Wewnątrz pliku będzie tylko 1 String po wyrażeniu „TERTIARY ?”.

Jako warunku można użyć także niektórych wyrażeń, np. (Byte.SIZE == 8) (zawsze true) lub (COMPILE_LOCAL && COMPILE_ANONUMOUS). Kompilacja warunkowa może być użyta do budowania różnych wersji oprogramowania z jednego kodu źródłowego lub do debugowania.

Leave a Response