Reklama: Najlepszy program partnerski w sieci , KLIKNIJ

Stwórz profil

Musisz wpisać swoje imię
Musisz wpisać swoje nazwisko
Musisz wpisać poprawny e-mail
Musisz wpisać hasło (min. 8 znaków)
Musisz zaakceptować regulamin

Adam Woźniak managing consultant
(formally), software
architect (actua...

Temat: enum: dostęp do membra

Cześć

Mam takiego enum-a:


public enum MajorEnum
{
X
{
public final int MOJE_POLE = 1;
public final int MOJE_POLE2 = 2;
public final int MOJE_POLE3 = 3;
} ,
Y
{
public final int MIEJSCE_W_METODZIE_1 = 1; }
;
}



Czy z innej klasy można się jakoś dobrać do MOJE_POLE?

Pozdrawiam,
AdamAdam Woźniak edytował(a) ten post dnia 24.11.11 o godzinie 14:31
24.11.2011, 13:50

Dariusz Wawer Programista, CC
Otwarte Systemy
Komputerowe

Temat: enum: dostęp do membra

A może w ten sposób?

public enum MajorEnum
{
X(1);
private majorEnum(int val) {
MOJE_POLE = val;
}
public final int MOJE_POLE;
}

(pisane bez IDE, może być niepoprawne formalnie, chodzi o ideę).
24.11.2011, 14:21

Adam Woźniak managing consultant
(formally), software
architect (actua...

Temat: enum: dostęp do membra

Dariusz Wawer:
A może w ten sposób?

public enum MajorEnum
{
X(1);
private majorEnum(int val) {
MOJE_POLE = val;
}
public final int MOJE_POLE;
}

(pisane bez IDE, może być niepoprawne formalnie, chodzi o ideę).

Doprecyzuję:
Chce, aby z poziomu innej klasy mieć dostęp do MOJE_POLE, czyli dostęp w rodzaju:


int zmienna = MajorEnum.X.MOJE_POLE;


Ten powyższy kod oczywiście się nie kompiluje. Dostaję błąd:

MOJE_POLE cannot be resolved or is not a field

Dzięki za odpowiedź,
AdamAdam Woźniak edytował(a) ten post dnia 24.11.11 o godzinie 14:29
24.11.2011, 14:28

Adam Woźniak managing consultant
(formally), software
architect (actua...

Temat: enum: dostęp do membra

Rozszerzyłem przykładowy kod w pierwszym poście.
24.11.2011, 14:31

Kamil Hark Programista
java/j2ee

Temat: enum: dostęp do membra

Nie, nie można, takie pola/stałe mogą być użyte tylko w kontekście metod enuma. np:


enum A {
X {
public final String x = "inner";

public String getX() {
return x;
}
};

public abstract getX();
}
Kamil Hark edytował(a) ten post dnia 24.11.11 o godzinie 15:06
24.11.2011, 15:06

Adam Woźniak managing consultant
(formally), software
architect (actua...

Temat: enum: dostęp do membra

Kamil Hark:
Nie, nie można, takie pola/stałe mogą być użyte tylko w kontekście metod enuma. np:


enum A {
X {
public final String x = "inner";

public String getX() {
return x;
}
};

public abstract getX();
}

Tego się właśnie obawiałem, że nie można.
Dzięki za info.
24.11.2011, 15:30

Adrian Chrząstowski projektant/programis
ta

Temat: enum: dostęp do membra

Każdy element enuma jest w tym przypadku instancja innej anonimowej klasy, które dziedziczą po klasie MajorEnum. Do klas anonimowych można dostać referencję chociażby wywołując na instancji obiektu metodę getClass, ale taki zapis, który chciałbyś uzyskać niestety nie wchodzi w grę:

Test$MajorEnum$1 x = MajorEnum.X;
System.out.println(x.MIEJSCE_W_METODZIE_1);

chyba, że czegoś nie wiem.
Z perspektywy kodu możesz jedynie dostać referencję do obiektu widzianego jako obiekt klasy MajorEnum:
MajorEnum e = MajorEnum.X;
Zatem w klasie MajorEnum trzeba dodać coś co pozwoliłoby dostać się 'głębiej', jak zresztą sugerowali przedmówcy.
Możesz zrobić coś takiego:

package x;

public class Test {
public static void main(String[] args) throws Exception {
System.out.println(MajorEnum.Y.getIntFieldValue("MIEJSCE_W_METODZIE_1"));
System.out.println(MajorEnum.X.getIntFieldValue("MOJE_POLE2"));
}

public static enum MajorEnum {
X {
public final int MOJE_POLE = 1;
public final int MOJE_POLE2 = 2;
public final int MOJE_POLE3 = 3;
},
Y {
public final int MIEJSCE_W_METODZIE_1 = 1;
};
public int getIntFieldValue(String fieldName) {
try {
return this.getClass().getField(fieldName).getInt(this);
} catch (Exception e) {
throw new RuntimeException("B\u0142\u0105d pobrania warto\u015Bci z pola o nazwie: " + fieldName + ".");
}
}
}
}

ale jak sam wiesz to rozwiązanie połowiczne i mocno wrażliwe na refaktoring.
24.11.2011, 16:39

Adam Woźniak managing consultant
(formally), software
architect (actua...

Temat: enum: dostęp do membra

Adrian

Rozwiązanie przedstawione przez Ciebie zapewne działa (via refleksja), ale nie zaspokaja to mojego oczekiwania, aby Eclipse automatycznie wyszukiwał mi miejsca w kodzie, gdzie użyte jest owe x.MIEJSCE_W_METODZIE_1.

Adrian, dzięki za post i kod.
Pozdrawiam,
Adam

PS.
Generalnie zbadałem, czy javove enumy można zaprząc do wielokrotnie zagnieżdżonych w siebie stałych (czyli właśnie enumów). Czyli kod mniej więcej taki:


enum Level1
{
Level2_1
{
enum Level2_1_1 {X, Y}
enum Level2_1_2 {X, Y}
}
, Level2_2
{
;
}
}


Ale taka konstrukcja w Java również nie jest dostępna. Szkoda, że tego nie ma.Adam Woźniak edytował(a) ten post dnia 24.11.11 o godzinie 17:10
24.11.2011, 17:10

Adam Woźniak managing consultant
(formally), software
architect (actua...

Temat: enum: dostęp do membra

OK, efekt, o który mi chodziło (statyczna zagnieżdżona struktura stałych) uzyskałem poprzez zagnieżdżone enumy.

Poniżej kod (kompiluje się):


public enum Level1
{ x;

public enum Level1_1 {x; public enum Level1_1_1 {x}
public enum Level1_1_2 {x}
public enum Level1_1_3 {x}
}
public enum Level1_2 {x; public enum Level1_2_1 {x}
public enum Level1_2_2 {x}
}
public enum Level1_3 {x; public enum Level1_3_1 {x} }
}


I poniżej przykład użycia:


Enum e1 = Level1.x;
Enum e1_2 = Level1.Level1_2.x;
Enum e1_2_1 = Level1.Level1_2.Level1_2_1.x;


I teraz jak wyszukuję w Eclipse wystąpień odwołań do np.: Level1.Level1_2.Level1_2_1.x, Eclispe oczywiście poprawnie pokaże mi odwołania do tegoż. I o to mi chodziło.
24.11.2011, 17:37

Rafał Głowiński Technical Team
Leader / Bravura
Solutions

Temat: enum: dostęp do membra

No dobrze, masz teraz rozwiązanie z mocnym typowaniem więc IDE pięknie Ci pomoże.

Pytanie z mojej strony jest inne: jaki problem wymagał, aż tak dziwacznego rozwiązania?

Czy Ty sam patrząc na taki kod nie pomyślałbyś sobie "WTF - Trzykrotnie zagnieżdżony enum?". Przypomina mi to trochę zawody na najbardziej nieczytelny kod. Ale to tylko moja opinia.
25.11.2011, 10:00

Dariusz Wawer Programista, CC
Otwarte Systemy
Komputerowe

Temat: enum: dostęp do membra

Adam Woźniak:
Ten powyższy kod oczywiście się nie kompiluje. Dostaję błąd:
MOJE_POLE cannot be resolved or is not a field

Jeśli chodzi o mój kod, to jedynym błędem była mała litera w nazwie konstruktora:


public enum MajorEnum {
X(1);
private MajorEnum(int val) {
MOJE_POLE = val;
}
public final int MOJE_POLE;
}


A na serio: po co Ci taka chora konstrukcja? Naprawdę nie jestem sobie w stanie wyobrazić jej zastosowania...
25.11.2011, 10:26

Adam Woźniak managing consultant
(formally), software
architect (actua...

Temat: enum: dostęp do membra

Odpowiadając na pytanie - po co mi coś takiego?
Po prostu mam w aplikacji drzewiastą strukturę niemutujących identyfikatorów (drzewiasta struktura pewnych stałych) i zastanawiam się, jak to w kodzie ogarnąć, abym mógł wygodnie wyszukiwać (wyszukiwanie statyczne), gdzie dana stała jest użyta.

Nie upieram się, że to rozwiązanie jest dobre / optymalne.

A odnośnie tego, że kod wydaje się nieczytelny. To rzecz gustu :) W przykładzie sformatowałem ten kod tak, że według mnie, w kodzie widać, jak wygląda to zagnieżdżenie.

Trzymajcie się,
Adam
28.11.2011, 10:22



Wyślij zaproszenie do