# Name eines boolean ausgeben (nicht den Wert)



## Super Gogeta (12. Mrz 2012)

Hallo!

Ich versuche gerade erfolglos herauszufinden, ob und wie es möglich ist, den Namen eines boolean auszugeben und nicht nur true bzw. false.

Beispiel:


```
for (boolean wert : ende) {
	if (wert) {
		String name = new Boolean(wert).toString(); //das schreibt ja nur true rein, soll aber den Variablennamen schreiben, weil ich den dann weiter übergeben muss
	}
}
```

Lässt sich das überhaupt machen?


----------



## faetzminator (12. Mrz 2012)

Den Namen "wert"?


----------



## tfa (12. Mrz 2012)

> Lässt sich das überhaupt machen?



Nein.

Ein "Boolean" hat keinen Namen. Variablen haben Namen.


----------



## pl4gu33 (12. Mrz 2012)

du möchtest also "wert" ausgeben ? was genau willst du damit bezwecken ?


----------



## bygones (12. Mrz 2012)

und diese sind Schall und Rauch ohne jegliche Bedeutung....

warum brauchst denn "wert" ?


----------



## Super Gogeta (12. Mrz 2012)

Ok, etwas schlecht geschrieben scheinbar.

Wir haben sowas:


```
boolean eins = true; boolean zwei = false;
wert = new boolean[] {eins, zwei};

for (boolean wert : ende) {
    if (wert) {
        String name = ... // da soll dann z.B. in name "eins" stehen, weil genau das dann wieder für anderes benutzt wird, was ja auch klappt, sofern ich den da hin bekomme
    }
}
```

Geht das?


----------



## bygones (12. Mrz 2012)

nein und ich versteh immer noch nicht was du bezwecken willst, dass [c]String name = "eins"[/c] ist... 

ich bezweifle dass "wieder fuer anderes benutzt wird" wirklich so gebraucht wird, was immer das sein mag. 

Wenn du erklaerst was genau der gesamte Kontext ist, so kann man konkretere Hinweise/Tipps geben.


----------



## nrg (12. Mrz 2012)

mal abgesehen davon, dass das codestück totaler stuss ist, stelle ich dir nochmal die frage: was willst du damit bezwecken?


----------



## faetzminator (12. Mrz 2012)

Das klingt mir ganz danach, als würdest du irgendwelche Properties (Einstellungen) speichern und ausgeben wollen. Wenn ja, dann könnte dir eine Map weiterhelfen. Da kannst du dann auch im Programm die Properties einfach abfragen.


----------



## KOKser (12. Mrz 2012)

Super Gogeta hat gesagt.:


> Ok, etwas schlecht geschrieben scheinbar.
> 
> Wir haben sowas:
> 
> ...



Servus,

dir geht es sicher darum raus zubekommen ob jetzt der erst oder der zweite Wert auf true gesetzt wurde oder?

Versuch es mal hiermit.

```
boolean eins = true; boolean zwei = false;
wert = new boolean[] {eins, zwei};

for (int i = 0;i<wert.length;i++) {
    boolean value = wert[i];
     if (value) {
            System.out.println("Treffer bei Index: "+(i+1));
    }
}
```


----------



## faetzminator (12. Mrz 2012)

... ausser, dass du statt [c]i[/c] fälschlicherweise [c](i+1)[/c] ausgibst. Anders würde es aussehen, wenn du [c](i + 1) + ". Element"[/c] ausgeben würdest.


----------



## nrg (12. Mrz 2012)

naja gut, das ist jetzt bisschen kritisch. abgesehen von programmierern denkt keiner zero-based


----------



## KOKser (12. Mrz 2012)

(i+1) war schon absichtlich so gewählt damit er nicht drüber Stolpert das das erste Element den Index 0 hat, ich werde mich bessern und nie wieder das Wort Index benutzen  .


----------



## faetzminator (12. Mrz 2012)

nrg, aber [c]Element mit Index 0[/c] entspricht nunmal dem [c]1. Element[/c] 
Stell dir vor, du würdest von einem User die Fehlermeldung "some Problem xy [Index 45]" kriegen, aber es würde das Element mit Index 44 betreffen. Würdest du dich da nicht aufregen? Sonst suchst du zuerst minutenlang am falschen Ort...


----------



## Super Gogeta (12. Mrz 2012)

Na gut, dann hole ich noch weiter aus.


```
for (boolean wert : ende) {
			if (wert) {
				String string = ... //hier bräuchte ich jetzt den Variablennamen als String
				if (ziel.equals("bEins")) {
					bEins.setIcon(getImage(string));
					if (lEins.getActionCommand().equals(string + "1")) {
						lEins.setIcon(nothing);
					} else if (lZwei.getActionCommand().equals(string + "1")){
						lZwei.setIcon(nothing);
					} else if (lDrei.getActionCommand().equals(string + "1")){
						lDrei.setIcon(nothing);
					} else if (lVier.getActionCommand().equals(string + "1")){
						lVier.setIcon(nothing);
					} else if (lFünf.getActionCommand().equals(string + "1")){
						lFünf.setIcon(nothing);
					}
					neu = ziel;
					bEins.setName(string);
					bEins.setActionCommand(string + "1");
					lEins.removeActionListener(this);
					bEins.removeActionListener(this);
				}
			}
}
```

Wie man sieht, baut so ziemlich alles auf den gleichen Namen auf bzw. werden darüber zugewiesen. Daher wollte ich das nun so machen, um entsprechend dem true-Wert (sind später mehr boolean, aber nur einer ist true) verschiedenes zu ändern.


----------



## SlaterB (12. Mrz 2012)

verwende eine Map<String,Boolean>,
map.put("eins",true);
usw.
über die Keys der Map kann man iterieren falls nötig, bestimmte Werte direkt abfragen

obligatorisch: siehe auch
http://www.java-forum.org/top-fragen/62032-fragen-variablennamen.html


----------



## pro2 (12. Mrz 2012)

Ich versteh das nicht.. du musst unbedingt dein Konzept überdenken. Wie oben bereits geschrieben haben die Variablen für den Computer keinen Namen.. du kannst natürlich ein Array/Map mit Strings noch nebenbei erstellen, sodass du immer den String passend zu dem boolean speichert. Sinn dahinter wage ich zu bezweifeln^^


----------



## irgendjemand (12. Mrz 2012)

verstehe den sinn zwar selbst auch nicht ... aber wenn man GANZ WEIT ausholt könnte man was über reflections basteln ... aber ob das so seinen sinn hat wage ich auch zu bezweifeln ...

würde TO hier auch eine grundlegende überarbeitung seines konzeptes empfehlen


----------



## Super Gogeta (12. Mrz 2012)

Sinnvoll oder nicht, es soll funktionieren, nichts anderes ist als Einsteiger wichtig.

Mit der Map klappt es sehr gut, danke dafür. Was mich jetzt noch beschäftigt, ist, wie ich den abgefragten Boolean aus der Map heraus auf false/true setzen kann.


```
map.get(wert) = false;
```

Das funktioniert ja dummerweise nicht. Ich kann natürlich am Ende der Aktionen alle möglichen Boolean manuell auf false setzen, aber das könnte ich auch mit allem anderen tun und das bringt´s ja nicht wirklich.


----------



## faetzminator (12. Mrz 2012)

[c]map.set(wert, false)[/c]


----------



## irgendjemand (12. Mrz 2012)

[edit]gut .. ich nehm meine antwort zurück ... war zu langsam[/edit]


----------



## SlaterB (12. Mrz 2012)

du müsstest schon wieder map.put() aufrufen,
oder als Value in der Map ein veränderlichers Objekt speichern, z.B. boolean[1], dann ginge
> map.get(wert)[0] = false;

schön ist aber auch anders


----------



## Alle besetzt (13. Mrz 2012)

Könnte man sich nicht ein eigenes Object schreiben?


```
public class NamedBoolean{

  private final Sring name;
  private boolean value; 

  public NamedBoolean(String name){
    this.name = name;
  }

  public String getName(){
    return name;
  }

  public void setV...

  @Override
  public String toString(){
    return NamedBoolean.class.getName()+"["+name+", "+value+"]";
  }

...
```


----------



## faetzminator (13. Mrz 2012)

Alle besetzt, das wär ja nichts anderes als eine [c]Map<String, Boolean>[/c]...


----------



## bygones (13. Mrz 2012)

faetzminator hat gesagt.:


> Alle besetzt, das wär ja nichts anderes als eine [c]Map<String, Boolean>[/c]...


jedoch eindeutiger... 

falls sich die Frage nach der Wiederverwendbarkeit stellt, dann sollte man sich Gedanken ueber eine Objekt anstatt einer Map machen.


----------



## faetzminator (13. Mrz 2012)

bygones, wenn du dann aber Zugriff in [c]O(1)[/c] auf den Key haben willst (weil es eben irgendwelche Prefs o.ä. sind), dann musst du schlussendlich auch wieder eine [c]Map<String, NamedBoolean>[/c], oder besser [c]Map<T, NamedBoolean<T>>[/c], verwalten...


----------



## bygones (13. Mrz 2012)

ach herrje und jetzt eine Performancediskussion.....


----------



## Gast2 (13. Mrz 2012)

Super Gogeta hat gesagt.:


> Sinnvoll oder nicht, es soll funktionieren, nichts anderes ist als Einsteiger wichtig.



Nein gerade für Anfänger ist es wichtig *richtig*zu programmieren damit sich keine blödsinnigen Arbeitsweisen einschleifen...


----------



## faetzminator (13. Mrz 2012)

bygones hat gesagt.:


> ach herrje und jetzt eine Performancediskussion.....



Man muss beim Coden nicht gross auf die Performance schauen. Aber dass man Collections mit den entsprechenden Vorteilen verwendet, ist nicht zu viel verlangt, oder  ?


----------



## Voltaire81 (13. Mrz 2012)

Ne Collection ist schon mal was feines für sowas. Klar kann man eine eigene Klasse schreiben für die Properties aber in einem solchen Fall ist es vielleicht ja eine Option die Klasse Properties zu nutzen. Java is ja nich blöde. Gibts doch alles schon. 

Und nur zur Vollständigkeit und der Korrektheit zuliebe. Natürlich ist es möglich sich den Namen einer Variablen ausgeben zu lassen. Geht nicht gibt's nicht.


----------



## Alle besetzt (13. Mrz 2012)

Ich würde aber lieber ein Array als eine Map benutzen.
Warscheinlich einfach weil mir Strings als key zuwider sind. 
Ich benutze bei sowas lieber Integer.  und dann könnte man auch eine Array nehmen.

Ich Programmiere zwar auch noch nicht so lange aber bei mir würde das so aussehen:


```
NamedBoolean nBoolean = new NamedBoolean[x];
```

Hat die verwendung einer Map<K,O>   irgendwelche vorteile die ich nich (er)kenne?


----------



## bygones (13. Mrz 2012)

Alle besetzt hat gesagt.:


> Warscheinlich einfach weil mir Strings als key zuwider sind.


warum dass denn ?


Alle besetzt hat gesagt.:


> Hat die verwendung einer Map<K,O>   irgendwelche vorteile die ich nich (er)kenne?


du musst dein Mapping nicht zwingend auf Integer biegen, da du als Key jegliches Objekt nehmen kannst.


----------



## Alle besetzt (13. Mrz 2012)

> Und nur zur Vollständigkeit und der Korrektheit zuliebe. Natürlich ist es möglich sich den Namen einer Variablen ausgeben zu lassen. Geht nicht gibt's nicht.



Ich habe es noch nie gebraucht. Aber wie würde das functionieren?
Und vorallem hätte das überhaupt einen Sinn?


```
boolean b1 = true;
boolean b2 = b1;

geheimnisVolleVariablenNamenAusgebeFunction(boolean b){
System.out.println(b.toName());  // Name: b !
}
```

Da sich so ein Name ja ändern kann.


----------



## faetzminator (13. Mrz 2012)

@Voltaire81: [c]Properties[/c] ist eine Kindklasse von [c]Hashtable[/c]  Allerdings sind dort IMHO alle Keys und Values Strings, da müsste man ein Bisschen etwas überschreiben.

@Alle besetzt: Klar, statt [c]"app.update.cert.requireBuiltIn"[/c] (ein Property als Beispiel von Firefox) würdest du lieber [c]634[/c] nehmen? Viel Spass


----------



## Voltaire81 (13. Mrz 2012)

faetzminator hat gesagt.:


> @Voltaire81: [c]Properties[/c] ist eine Kindklasse von [c]Hashtable[/c]  Allerdings sind dort IMHO alle Keys und Values Strings, da müsste man ein Bisschen etwas überschreiben.



Ist mir bewusst, danke. Es ging mir bei dem Vorschlag auch weniger um die zusätzliche Funktionalität (der Fall hier ist trivial) sondern das Anwenden des richtigen Konstrukts... Ich bin nun seit 10 Jahren unterwegs als IT-Consultant und bereinige ganz üblen Code. Dieses 'reinviting the wheel' ist dabei eines der häufigsten Probleme...


----------



## Alle besetzt (13. Mrz 2012)

bygones hat gesagt.:


> warum dass denn ?



Habe ich mir so angewöhnt.
Ein int ist eindeutig, ein String sind "mehrere ints".
Man kann 
	
	
	
	





```
for(in i = 0; i < (int)x;i++);
```
 schreiben. 
	
	
	
	





```
for(String s = "key1"; s < ?; s++
```
 wird schwieriger.

Alle besetzt


----------



## Voltaire81 (13. Mrz 2012)

Alle besetzt hat gesagt.:


> Ich habe es noch nie gebraucht. Aber wie würde das functionieren?
> Und vorallem hätte das überhaupt einen Sinn?
> 
> 
> ...




Sorry, gerade übersehen...
Was das für einen Sinn macht lässt sich so ad hoc nicht sagen. Ich hatte Anwendungsfälle. Da ging es aber eher um das Ermitteln von Methoden-Namen... In dem konkreten Fall hier keine....
Die 'geheimnisVolleVariablenNamenAusgebeFunction' : 


```
void geheimnisVolleVariablenNamenAusgebeFunction(){
        Field[] f = this.getClass().getDeclaredFields();    
        for (int i = 0; i < f.length; i++) {
            Field field = f[i];
            System.out.println(field.getName());
        }
    }
```


----------



## Gast2 (13. Mrz 2012)

> Ein int ist eindeutig, ein String sind "mehrere ints".


Ein String ist genauso eindeutig wie ein int. Wie kommst du drauf dass ein String nicht eindeutig ist?


----------



## faetzminator (13. Mrz 2012)

Alle besetzt hat gesagt.:


> Habe ich mir so angewöhnt.
> Ein int ist eindeutig, ein String sind "mehrere ints".
> Man kann
> 
> ...



Diesen Anwendungsfall gibts bei Maps auch nicht. Entweder willst du einen Wert holen [c]V get(K)[/c], speichern [c]put(K, V)[/c], löschen [c]remove(K)[/c] oder mit [c]entrySet().iterator()[/c] über alles iterieren.


----------



## SlaterB (13. Mrz 2012)

EikeB hat gesagt.:


> Ein String ist genauso eindeutig wie ein int. Wie kommst du drauf dass ein String nicht eindeutig ist?




mehrere Strings haben denselben hashCode(), das ist schon ein gewisser Punkt,
in einer Map bzw. allen ernsthaften Anwendungen für hashCode() wird aber danach noch equals geprüft


----------



## Gast2 (13. Mrz 2012)

Es gibt beliebig viele Strings, da ist es klar dass es beim hashCode() zu Kollisionen kommen muss.
Aber wie du schon sagst, das stört die Map ja nicht wirklich, entscheidend ist dann dass equals() richtig implementiert ist. Und das ist beim String denke ich der Fall.
Das ist für mich jetzt kein Argument String als HashMap Key zu verteufeln


----------



## Alle besetzt (13. Mrz 2012)

Voltaire81 hat gesagt.:


> ```
> void geheimnisVolleVariablenNamenAusgebeFunction(){
> Field[] f = this.getClass().getDeclaredFields();
> for (int i = 0; i < f.length; i++) {
> ...




Habe kein Eclipse hier, aber laut JavaDocs gibt das ja die Namen sämtlicher Variablen in DER classe aus?
Ich werds nacher zuhause mal Testen.



> Ein String ist genauso eindeutig wie ein int. Wie kommst du drauf dass ein String nicht eindeutig ist?



Das tut mir leid, DAS sollte jetzt nicht der Aufhänger für den Thread werden.
Und meine erklärung ist rein Subjektiv:
Ich kann mir Zahlen einfach besser Merkenn, kenne von [STRIKE]fast[/STRIKE] jedem/r bei uns in der Klasse die Telephon Number und nur von ungefähr der Hälfte den Namen ;(.



> @Alle besetzt: Klar, statt "app.update.cert.requireBuiltIn" (ein Property als Beispiel von Firefox) würdest du lieber 634 nehmen? Viel Spass




Wenn die Strings allerdings wie hier 
	
	
	
	





```
"app.update.cert.requireBuiltIn"
```
 einen logischen aufbau haben geht das ja. Aber woher will ich wissen das es diesen Baum an *Property* wirklich gibt? Bei zahlen kann man immer ++ nehmen.


----------



## faetzminator (13. Mrz 2012)

Alle besetzt hat gesagt.:


> [...] Aber woher will ich wissen das es diesen Baum an *Property* wirklich gibt?



Wenn du dich entscheidest, Einstellungen als Properties (statt z.B. XML) zu speichern, dann sagst ganz alleine du, wie die heissen


----------



## Andi_CH (13. Mrz 2012)

SlaterB hat gesagt.:


> mehrere Strings haben denselben hashCode(), das ist schon ein gewisser Punkt,
> in einer Map bzw. allen ernsthaften Anwendungen für hashCode() wird aber danach noch equals geprüft



Der Hashcode kann unmöglich eindeutig sein, wenn er weniger Bits hat, als die Daten im Objekt zusammengezählt. Diese Erkenntnis ist übrigens so alt wie die Begriffe Checksumme, Parity und ähnliche ;-)


----------

