Assertion Facility #2 - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Java

Assertion Facility #2

java

13. března 2002, 00.00 | Již podruhé se podíváme na novinku v Java 2 verze 1.4 Assertion Facility. Také se zmíním způsobu, jak používat podmíněný překlad v Javě 2.

Jak jsem slíbil dnes si dokončíme Assertion Facility tj. podíváme se kompilaci a spuštění, zpětnou kompatibilitu s verzi 1.3. Mimo to se také podíváme na podmíněný překlad v Javě, který bude potřebovat.

Pozn.: Tento článek navazuje na předchozí díl Assertion Facility, ve kterém je úvod do této problematiky.

Tak a jdeme na to!

Kompilace a spuštění

Jak již bylo řečeno, pro kompilaci bude nutná Java 2 ve verzi 1.4 SE. První věcí, která bude nutná přidat parametr při volání javac.

javac -source 1.4 [něco].java

Takto si zajistíme, že kompilace proběhne správně. A kompiler nás nebude upozorňovat na chybu použití klíčového slova assert.

!!! POZOR !!! Java bez tohoto parametru defaultně kompiluje v modu 1.3 — největší kompatibility se stávajícími verzemi. V této verzi ovšem neexistuje klíčové slovo assert a kompilátor daný kód nezkompiluje!

Zatímco v módu 1.4 zkompilujete a spustíte daný program bez nejmenších problémů. Ale !!! POZOR !!! budete-li se pokoušet spustit takto zkompilovaný program v Javě 2 verzi 1.3 vypíše chybovou hlášku a nespustí ho! Přesně řečeno, oznámí vám, že class soubor má nepodporovanou verzi.

Další logickou částí je spouštění programu. V minulém odstavci jsem říkal, že verze Javy 1.3 nedovede s takto kompilovaným class souborem pracovat, proto se zaměřím pouze na verzi 1.4. Ta dovede spouštět kód v několika variantách.

Základní variantou je, tu kterou jste používali až dosud tj. bez speciálních parametrů pro assertion. Takto spuštěný program přeskakuje všechny místa, kde se nachází. To má za následek, že program nevytváří žádné AssertionException a tedy nenastává žádná výjimka — program běží bez přerušení.

java [něco].java

Stejný význam má parametr -da resp. -disableassertions.

java -da [něco].java
java -disableassertions [něco].java

Pravým opakem je spuštění programů s povolenou asercí, která nám bude umožňovat „ladění“ .

java -enableassertions Prog // resp.
java -ea Prog

Důležité upozornění: -ea resp. -da může obsahovat určení třídy na kterou se vztahuje. Obě se mohou vyskytovat v příkazové řádce najednou. Zřejmější to bude na příkladu.

-ea
-ea:<class   name>
-ea:...
-ea:<package name>...
Zpětná kompatibilita s verzí 1.3

Bylo řečeno, že class soubory s assertion jsou nespustitelné pro Javu 2 ve verzi 1.3. To však neznamená, že to nelze nějak obejít. Řešení se nachází v podmíněném překladu. Tomu co je a jak funguje podmíněný překlad se budu věnovat v příštím článku o Javě.

     static    final    boolean assertionsEnabled = true; // existence asserce
     ...
     if  (assertionsEnabled)
          assert  podmínka: text;

Podle následující stačí do začátku třídy vložit konstantu, u nás assertionsEnabled, typu boolean. A kdekoliv v kódu, kde budu potřebovat aserci se nejdříve musím vložit podmínku, zda je true. Díky tomuto podmíněnému překladu mohu v klidu ladit program s assertion(assertionsEnabled je nastaveno na true) či vytvořit class soubory, které budou spustitelné jen ve verzi 1.4. Pokud budu potřebovat vytvořit verzi kompatibilní s verzi 1.3, pak jen stačí změnit assertionsEnabled na false a zkompilovat z defaultní verzi tj. jako 1.3 (bez parametru -source 1.4).

Můžete však namítat, že umístění podmínky před každé assertion je dost zdlouhavé. Souhlasím, ovšem je nutno si vždy vybrat zda o to stojím či ne. A pokud ano, tak musím počítat i s následky.

Podmíněný překlad

V programovacích jazycích je často využívám pro ladění programů či pro vytváření odlišných verzí změněním jednoho slova. Do bloků podmíněného překladu je možno psát jakýkoliv kód. Často se zde nachází něco co zobrazuje programátorovi co se právě děje s programem. Či zde bývá defaultní nastavení některých hodnot, které se za normálního běhu získávají jinou cestou.

Například v Delphi se podmíněný překlad řeší zápisem {$DEFINE ...} a daný kód se pak zařazuje mezi {$IFDEF ...} a {$ENDIF}. Takže výsledný kód nikterak neliší od ostatního.

Java bohužel nic takového nemá. Ale obstojně to dokáže nahradit trochu odlišným způsobem, jehož výsledek je stejný jako v Delphi.

Základ spočívá v deklaraci konstanty, obvykle na co nejnižší úrovni, a obvykle také type boolean. V následném kódu stačí vytvořit podmínku s naší konstantou. Tak lze vytvořit bloky podmíněného překladu ať pro hodnotu true či false.

Nejjednodušší příklad by mohl vypadat asi takto:

public  class  FirstProgram {
     static    final    boolean DEBUGING = true; // konstanta

     public  static  void  main(String  [] args)
     {
     System.out.println("Hello");
     if  (DEBUGING)
          System.out.println("How are you?");

     System.out.println("Bye");
     }
}

Takovýto kód se chová při překladu v závislosti na hodnotě konstanty. Podmínky které neodpovídají hodnotě konstanty nejsou vůbec zahrnuty do class souboru. Proto se nemusíte bát zde uvádět či zobrazovat důvěrné informace, které by mohli pomoci hackerům v jejich práci, pokud ovšem hodnota konstanty bude nastavena ve finální verzi tak, aby se dané podmínky nevyhodnotili jako true.

Tento kód programátora neomezuje, aby v programu resp. třídě definoval několik takovýchto konstant. Jedinou nevýhodou, kterou tento postup má, je fakt, že kompilace se o něco zpomaluje velikostí i nepotřebného kódu. Ale není to zase až tak strašné, aby se s tím muselo dělat něco speciálního.

A to je opravdu vše. Konec seriálu.

Příklad na podmíněný překlad si můžete stáhnout v souboru condasm.zip (1 kB).

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Java  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: