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
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ę).
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
Adam
Woźniak
managing consultant
(formally), software
architect (actua...
Temat: enum: dostęp do membra
Rozszerzyłem przykładowy kod w pierwszym poście.
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:Kamil Hark edytował(a) ten post dnia 24.11.11 o godzinie 15:06
enum A {
X {
public final String x = "inner";
public String getX() {
return x;
}
};
public abstract getX();
}
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.
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.
Adam
Woźniak
managing consultant
(formally), software
architect (actua...
Temat: enum: dostęp do membra
AdrianRozwią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
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.
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.
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...
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
