[Java] constante voor case in externe class

Pagina: 1
Acties:

  • ArmEagle
  • Registratie: Oktober 2001
  • Laatst online: 18-06 08:00
Ik heb het volgende probleem.
Ik heb twee classes. In de een staan constanten opgenomen in de ander staat een switch statement waar ik die constanten in de case wil zetten.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package test;
public class Com {
  static protected int EEN = 1;
  static private int TWEE = 2;
  static public int DRIE = 3;
}

package test;

import java.io.*;
import test.Com;

public class In {
  private static Com c = new Com();
  public static void main(String[] args) {
    switch(1) {
    case (c.EEN) : System.out.println("1");
    case (c.TWEE) : System.out.println("2");
    case (c.DRIE) : System.out.println("3");
    }
  }
}

Bij compilatie krijg ik echter de foutmelding:
code:
1
2
3
4
5
6
test/In.java:12: constant expression required
      case (c.EEN) : System.out.println("1");
           ^
test/In.java:13: constant expression required
      case (c.TWEE) : System.out.println("2");
           ^

Nu kan ik wel een if-else gebruiken, maar is hier niet gewoon een simpelere oplossing voor?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

je moet er ff final voorzetten. DUs final static public int DRIE = 3. Ps.. je moet de break ook niet vergeten :D

dus
code:
1
2
3
4
5
6
7
8
9
10
switch(i){
   case 1: 
    System.out.println("1");
    break;
   case 2: 
    System.out.println("2");
    break;
   default:
     System.out.println("het was iets anders");
}

Want anders krijg je bij 1. dus
1
2
het was iets anders
op je scherm, omdat de rest van de cases ook worden gepakt.

  • ArmEagle
  • Registratie: Oktober 2001
  • Laatst online: 18-06 08:00
Die break was ik idd ff vergeten.
Maar bedankt, want uiteindelijk werkte het met final wel.
Lekker vaag eerst werkte het echt niet.

  • ArmEagle
  • Registratie: Oktober 2001
  • Laatst online: 18-06 08:00
Het volgende werkt dus idd wel:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package test;

public class Com {
  final static public int EEN = 1;
  final static public int TWEE = 2;
}


package test;

import java.io.*;
import test.Com;

public class In {
  final static private int DRIE = 3;
  public static void main(String[] args) {
    switch(1) {
    case Com.EEN : System.out.println("1"); break;
    case Com.TWEE : System.out.println("2"); break;
    case DRIE : System.out.println("3"); break;
    }
  }
}

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op woensdag 26 juni 2002 18:52 schreef ArmEagle het volgende:
Het volgende werkt dus idd wel:
Je layout is nogal wazig (vergelijk het maar eens met mijn code). En ik neem aan dat er niet altijd switch(1) komt te staan? Verder is het trouwens vrij ongebruikelijk om over meerdere files je constanten hebben staan voor een switch case statement.

  • ArmEagle
  • Registratie: Oktober 2001
  • Laatst online: 18-06 08:00
jouw opmerkingen zijn helemaal correct, maar dit was slechts een heel simpel voorbeldje om er eens achter te komen hoe het zou moeten.
De bedoeling is, dat we centraal een aantal constanten in een class opslaan en zodat we die niet in alle andere classes hoeven te declareren. Op deze manier kan er ook gewerkt worden richting een class die de constanten uit een database haalt.
(Dan wordt het weer lastig met een switch die constanten wil en geen variablen, maar ja.)
En dat ik in de class In ook een constante had staan was ook maar een testje.

Maar bedankt voor je hulp. (Ook al is deze reactie nogal laat)

  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

Op woensdag 26 juni 2002 23:46 schreef ArmEagle het volgende:
De bedoeling is, dat we centraal een aantal constanten in een class opslaan en zodat we die niet in alle andere classes hoeven te declareren. Op deze manier kan er ook gewerkt worden richting een class die de constanten uit een database haalt.
in dat eerste geval vind ik het handig om een interface te definieren waar dat soort dingen inzitten:
code:
1
2
3
4
5
6
7
8
public interface Constants {
   public static final int EEN = 1;
   public static final int TWEE = 2;
}

public class Foo implements Constants {
...
}

With the light in our eyes, it's hard to see.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op donderdag 27 juni 2002 09:21 schreef Bobco het volgende:

[..]

in dat eerste geval vind ik het handig om een interface te definieren waar dat soort dingen inzitten:
code:
1
2
3
4
5
6
7
8
public interface Constants {
   public static final int EEN = 1;
   public static final int TWEE = 2;
}

public class Foo implements Constants {
...
}
Ik zou zelfs helemaal van die interface af gaan en het volgende gaan doen (vooral als je dus niet geinteresseerd bent in de waardes, maar in toestanden/types).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Type{
   public final static INT = new Type("int");
   public final static REAL = new Type("real");
   public final static BOOL = new Type("bool");
    
   private String _discription;
  
   private Type(String discription){
     _discription = discription;
   }

   public String toString(){
     _dicription;
   }
}

Eventueel kan je hier nog een visitor design pattern aan toevoegen :9 om heel eenvoudig 'te switchen'. Veel switch cases zijn bij mij allemaal vervangen door dit systeem.

  • Xanthus
  • Registratie: Februari 2002
  • Laatst online: 11-07 12:45
Op woensdag 26 juni 2002 23:46 schreef ArmEagle het volgende:
Op deze manier kan er ook gewerkt worden richting een class die de constanten uit een database haalt.
Hoe wil je constanten uit een database halen? Zijn ze dan nog wel constant?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op donderdag 27 juni 2002 13:45 schreef Xanthus het volgende:

[..]

Hoe wil je constanten uit een database halen? Zijn ze dan nog wel constant?
precies. Het probleem is dat de constanten compile time bekend moeten zijn, en niet runtime. Wat de compiler doet is gewoon de verwijzing naar die constante vervangen door zijn waarde. (Daarom moet je ook altijd alles gaan hercompileren als je een constante waarde hebt aangepast).
Pagina: 1