Programmering

Java Tip 5: Java-konstanter

Denne uge opretter vi nogle konstanter, der har alle fordelene ved at bruge C-forprocessorens faciliteter til at definere kompileringstidskonstanter og betinget kompileret kode.

Java har slettet hele forestillingen om en tekstforbehandling (hvis du tager Java som en "nedstammer" af C / C ++). Vi kan dog få de bedste fordele ved i det mindste nogle af C-forprocessorens funktioner i Java: konstanter og betinget kompilering.

En af de ubestrideligt gode egenskaber ved C-forprocessoren er evnen til at definere kompileringstidskonstanter ved hjælp af et tekstnavn for at repræsentere en værdi. Dette gør det lettere at læse og vedligeholde. Det er også hurtigere ved kørsel end ved hjælp af en normal variabel.

Et uden tvivl misbrugt træk ved C-forprocessoren er brugen af #Definere sammen med #ifdef og venner at betinget kompilere hele blokke af kode. Jeg siger, det kan diskuteres, da folk ofte bruger denne facilitet til at håndtere platformsspecifikke problemer (og det er begge det gode punkt og det dårlige punkt).

I C kunne man definere nogle konstanter i en headerfil via:

#define MY_BDATE 10 #define SILLY_PLATFORM 

og derefter få adgang til disse konstanter ved hjælp af #omfatte at inkludere dem i en kodefil og derefter bruge dem:

fprintf (stderr, "Min fødselsdag er på% d" "th! \ n", MY_BDATE); 

Det tilsvarende i Java kan gøres ved at oprette offentlig statisk finale variabler i en Java interface:

interface ConstantStuff {offentlig statisk endelig int MY_BDATE = 10; offentlig statisk endelig boolsk SillyPlatform = sand; } 

Så kan vi få adgang til dem ved hjælp af importere for at gøre grænsefladen synlig for os og derefter bruge konstanterne:

System.out.println ("Min fødselsdag er på" + ConstantStuff.MY_BDATE + "th!"); 

C-forprocessoren kan betinget fjerne store områder af tekst, hvis en given forprocessorkonstant var eller ikke var defineret.

#if defined (SILLY_PLATFORM) / * Masser af grim kode til at håndtere dumhederne i * SILLY-platformen. * / #else / * Kode til at håndtere andre normale platforme. */ #Afslut Hvis 

Mange mennesker klager over, at denne evne ikke findes i Java. Husk, at en af ​​grundene til, at Java er så vidunderligt, er, at sproget er så meget bedre defineret, så systemspecifik kode som den skal ikke endda være nødvendigt.

Uanset hvad det er, kan du stadig få den slags betinget kompileret kode fra compileren direkte! Du bruger bare offentlig statisk endelig boolsk konstanter som betingelse for en regelmæssig hvis udmelding. Java-kompilatoren er smart nok til at genkende det som et specielt tilfælde, og det kan helt fjerne testen og koden for den relevante betingede gren.

Så skriv bare den betingede erklæring som normalt.

 hvis (ConstantStuff.SillyPlatform) {// Kode, der skal bruges, hvis platformen er sand * på kompileringstidspunktet *. } ellers {// Kode, der skal bruges, hvis platformen er falsk * ved kompileringstidspunktet *. } 

Jeg ved ikke om dig, men jeg hader at skulle skrive det så længe interface navn, før du bruger nogen af ​​disse konstanter. Så jeg har bare min klasse, der skal bruge disse konstanter implementere det interface. Så kan jeg bare bruge navnet direkte, forudsat at der ikke er nogen navnekollisioner (i hvilket tilfælde skal du skelne dem ved hjælp af de fulde navne).

Jeg har samlet alle disse sjove ting i et par enkle Java-applikationer. Konstanter (//www.javaworld.com/javatips/javatip5/Constants.java) redskaber det interface og bruger konstanterne direkte, mens Constants2 (//www.javaworld.com/javatips/javatip5/Constants2.java) bruger fuldt kvalificerede navne til at få adgang til konstanterne.

John D. Mitchell er endnu en UC-Berkeley-kandidat fra datalogi fravænnet med koffein, sukker og alt for lidt søvn. Han brugte tre år på PDA-software hos Geoworks til lager, der faktisk er mere værd end tapet. Han reddet sit daglige job efter den første offentlige frigivelse af Java til at udvikle applets og en Java-kompilator. Han finansierer sin Java-afhængighed ved at skrive kompilatorer, Tcl / Tk, Perl, C ++ og Java-systemer. Hans rigelige fritid forbruges ved at moderere comp.lang.tcl.announce nyhedsgruppen og skrive en fantastisk Java-bog.

Denne historie, "Java Tip 5: Java-konstanter" blev oprindeligt udgivet af JavaWorld.