/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
hvordan laves "DEFINE" i java
Fra : holst


Dato : 11-03-04 13:40

Hej alle..

Jeg har brug for nogle globale konstanter i java tilsvarende c's DEFINE. jeg
har derfor lavet en Definitions klasse som er en singleton, hvor jeg har
oprettet en række public konstanter:

public final CONTROL = 1;
public final POSITION = 2;

Nu har jeg så en anden klasse, hvor jeg skal bruges de globale definitions i
en switch ala:

int type;
switch(type){
case Definitions.getSingleton().CONTROL:
System.out.println("Haii")
osv
}

og det er så her compileren brokker sig med følgende besked vedr. CONTROL:

"case expression must be constant expressions"

Er der nogen der kan hjælpe med ovenstående - eller er der en helt anden
måde at lave c's DEFINE på?

mvh.
Allan Eriksen



 
 
Søren Berg Glasius (11-03-2004)
Kommentar
Fra : Søren Berg Glasius


Dato : 11-03-04 13:59

Hejsa Allan

Hvis jeg har konstanter som jeg skal bruge i flere klasser plejer jeg at
lave dem i interfaces, og lader så min klasse implementere dette
interface, hvor der kun er konstanter defineret. På den måde kan jeg
bruge konstanterne direkte i koden uden første at skrive klassenavnet
før konstant-navnet.

mikro eksempel

public interface Konstanter {
   public final static int K1 = 1;
   public final static int K2 = 2;
}

public class Test implements Konstanter {

   public void metode(int p) {

      switch(p) {
         case K1:

            break;
         case K2:
         
            break;
   
         default:

      }
   }
}


MVH
Søren

holst (11-03-2004)
Kommentar
Fra : holst


Dato : 11-03-04 14:13

mange tak for det hurtige svar - og faktisk en ret god løsning efter min
mening

mvh
Allan
"Søren Berg Glasius" <Soeren@Glasius.dk> wrote in message
news:c2pnqu$1akb$1@news.cybercity.dk...
> Hejsa Allan
>
> Hvis jeg har konstanter som jeg skal bruge i flere klasser plejer jeg at
> lave dem i interfaces, og lader så min klasse implementere dette
> interface, hvor der kun er konstanter defineret. På den måde kan jeg
> bruge konstanterne direkte i koden uden første at skrive klassenavnet
> før konstant-navnet.
>
> mikro eksempel
>
> public interface Konstanter {
> public final static int K1 = 1;
> public final static int K2 = 2;
> }
>
> public class Test implements Konstanter {
>
> public void metode(int p) {
>
> switch(p) {
> case K1:
>
> break;
> case K2:
>
> break;
>
> default:
>
> }
> }
> }
>
>
> MVH
> Søren



Filip Larsen (11-03-2004)
Kommentar
Fra : Filip Larsen


Dato : 11-03-04 15:37

Søren Berg Glasius skrev

> Hvis jeg har konstanter som jeg skal bruge i flere klasser plejer jeg
at
> lave dem i interfaces, og lader så min klasse implementere dette
> interface, hvor der kun er konstanter defineret. På den måde kan jeg
> bruge konstanterne direkte i koden uden første at skrive klassenavnet
> før konstant-navnet.

Det anses for dårlig praksis (et "anti-pattern") at implementere et
interface med konstanter bare for at kunne slippe for at skrive
klassenavnet. Har man brug for nem adgang til konstanter, så kan man fx.
samle dem i et interface med et tilpas kort navn som man derefter kan
importerer. Med Java 1.5 kan man også benytte den nye "static import"
feature.


Mvh,
--
Filip Larsen



KPV (11-03-2004)
Kommentar
Fra : KPV


Dato : 11-03-04 14:56

> public final CONTROL = 1;
> public final POSITION = 2;

Hvis du sætter nogen datatyper på skulle det da kunne gøre det?



Lars Borup Jensen (12-03-2004)
Kommentar
Fra : Lars Borup Jensen


Dato : 12-03-04 10:01

Normalt "Pattern" for at gøre dette er at placere static variable
på en klasse f.eks. Constants ala:

public abstract class Constants
{
   public final static int CONTROL = 1;
   publif final static int POSITION = 2;
}

Klient

if (Contants.CONTROL == myVar) { osv osv...

Grunden til at Constants klassen er abstract, er at man ikke skal
kunne instanciere en instans, da alle fields er static osv.

Et andet pattern er noget ala ENUM i C.

public class Constant
{
   private int val = -1;
   private Constant(int val) { this.val = val; }

   public final static CONTROL = new Constant(0);
   public final static POSITION = new Constant(1);
}

På denne måde kan du i samme VM lave == comparison på Constant eg.

if (Constant.CONTROL == MyOtherConstant) osv osv.

Læg mærke til at constructor er private.

HUSK at hvis der er flere class-loadere eller VM'er involveret, skal
man nok implementere readResolve metoden... (Se Serialization)




In article <c2pmep$mc1$1@sunsite.dk>, holstFJERNES@control.auc.dk
says...
> Hej alle..
>
> Jeg har brug for nogle globale konstanter i java tilsvarende c's DEFINE. jeg
> har derfor lavet en Definitions klasse som er en singleton, hvor jeg har
> oprettet en række public konstanter:
>
> public final CONTROL = 1;
> public final POSITION = 2;
>
> Nu har jeg så en anden klasse, hvor jeg skal bruges de globale definitions i
> en switch ala:
>
> int type;
> switch(type){
> case Definitions.getSingleton().CONTROL:
> System.out.println("Haii")
> osv
> }
>
> og det er så her compileren brokker sig med følgende besked vedr. CONTROL:
>
> "case expression must be constant expressions"
>
> Er der nogen der kan hjælpe med ovenstående - eller er der en helt anden
> måde at lave c's DEFINE på?
>
> mvh.
> Allan Eriksen
>
>
>

kgc (12-03-2004)
Kommentar
Fra : kgc


Dato : 12-03-04 12:28

Nu har du allerede fået en række svar på hvilke mønstre du ellers kan
bruge, og jeg forstår da heller ikke helt hvorfor du vil bruge
singleton, det virker lidt unødvendigt overhovedet at ville lave en
instans, når du kun har brug for konstanterne - men se de andre svar

> int type;
> switch(type){
> case Definitions.getSingleton().CONTROL:
> System.out.println("Haii")
> osv
> }
>
> og det er så her compileren brokker sig med følgende besked vedr. CONTROL:
>
> "case expression must be constant expressions"
Du kan ikke lave en case-del der afhænger af et ikke-konstant udtryk.
Med andre ord, så kan du ikke benytte switch-konstruktionen hvis ikke du
kan angive mulighederne som konstanter (brug if-then-else).

Mvh. Kasper

Christian Holm (12-03-2004)
Kommentar
Fra : Christian Holm


Dato : 12-03-04 17:00

"holst" <holstFJERNES@control.auc.dk> wrote in message
news:c2pmep$mc1$1@sunsite.dk...
> public final CONTROL = 1;
> public final POSITION = 2;

Jeg vil klart anbefale at man benytter type-safe enum pattern til dette. En
søgning på google giver massere af information om hvordan dette fungerer.
Ellers kan "Effective Java Programming Language Guide" af Joshua Bloch på
det kraftigeste anbefales. Er uden tvivl den bedste programmeringsbog jeg
har læst, og jeg har efterhånden læst rigtigt mange.

Christian



Mikkel Bundgaard (15-03-2004)
Kommentar
Fra : Mikkel Bundgaard


Dato : 15-03-04 20:27

On Fri, 12 Mar 2004 17:00:21 +0100, Christian Holm wrote:

> "holst" <holstFJERNES@control.auc.dk> wrote in message
> news:c2pmep$mc1$1@sunsite.dk...
>> public final CONTROL = 1;
>> public final POSITION = 2;
>
> Jeg vil klart anbefale at man benytter type-safe enum pattern til dette. En
> søgning på google giver massere af information om hvordan dette fungerer.
> Ellers kan "Effective Java Programming Language Guide" af Joshua Bloch på
> det kraftigeste anbefales.
Hvis Allan er skiftet til Java 1.5 kan han også bruge de enumerated typer
der er tilføjet til sproget.
http://jcp.org/aboutJava/communityprocess/jsr/tiger/enum.html
http://java.sun.com/developer/technicalArticles/releases/j2se15/
--
Mikkel Bundgaard
Ph.D. student at IT University of Copenhagen
http://www.itu.dk/people/mikkelbu/
Codito, Ergo Sum

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste