Variablennamen verketten

onkelSuSE

Mitglied
hallo,

ich hab eine anfängerfrage. wie kann ich Variablen-Namen verketten ( Nicht zu verwechseln mit der Verkettung der Inhalte der Variablen )?

also ... ich möchte den wert einer variable in eine andere variable schieben, die ähnlich heißt ( davon, aber sehr viele... sagen wir 20 variablen ). dafür möchte ich einen variablen Converter bauen.

ich habe also:
Variable 1 = name --> Inhalt: Mustermann
Variable 2 = nameItem --> Inhalt: leer

manuel würde ich "nameItem = name" machen!

ein converter sollte sowas ähnliches machen wie:

name+"Item" = name;

wobei ich die quell-Felder über Reflection bekomme!

Vielen Dank!
 

AmunRa

Gesperrter Benutzer
Ich habs so jetzt nicht ganz verstanden, was du machen möchtest, aber ich rate dir eher mal dein design zu über denken, und schaun ob nicht eine Datestruktur wie z.B. eine Map für dich das richtige sind.

edit : habs mir nochmal durchgelesen und bin mir nun sicher, dass das was du vorhast stark nach einem fehlerhaften design aussieht.


Beschreib mal genau was du machen willst und warum. Reflection sollte man nur sehr sparsam einsetzen
 

onkelSuSE

Mitglied
ok ... ich arbeite mit Gwt/SmartGwt. dort hole ich vom server daten ... z. B. eine addresse.

wenn ich auf dem client angekommen bin, habe ich in einem ValueObjekt die adresse.

jetzt möchte ich diese adresse in Felder einer DynamicForm schieben.

die Felder des ValueObjects heißen z. B. Name, Strasse, Ort

und die ViewFelder heißen NameItem, StrasseItem, OrtItem
 

Antoras

Top Contributor
Code:
class ValueObject {
  type name
  type street
  type country
  // getter/setter + ctor
}

// auf dem Client
method dataChanged(ValueObject o) {
  this.nameItem = o.getName()
  this.streetItem = o.getStreet()
  this.countryItem = o.getCountry()
}

// auf dem Server
gui.dataChanged(new ValueObject("Max", "Musterstraße", "DE"))
Hier mit Reflection zu arbeiten wäre wie schon gesagt ein Designfehler. Zu viele Variablen sind auch nichts - auch wenn man bei GUIs immer ein bisschen mehr benötigt.
 
Zuletzt bearbeitet:

onkelSuSE

Mitglied
hmm??? das is ja total umständlich??

da tipp ich mich ja tot!

denn ich muss ja auf der serverseite die entity in das valueObject schieben
und dann auf dem Client den ganzen Murks wieder aus dem ValueObject in die FormFelder????

Warum Ist Reflection so resourcenhungrig?
 

onkelSuSE

Mitglied
ein StringArray? hoffe ich habs richtig verstanden! Bin ja noch Anfänger. :)
aber dann würd ich trotzdem gern wenigstens beim Programmstart einmal die Variablen holen per Reflection und dann ins StringArray schieben? sonst muss ich die Felder in Entity, Vo,Form, Entity2Vo, Vo2Form schreiben. Das is ein bischen lästig zugegebenermaßen! :)

und dann hätte ich ja immernoch nicht das ursprungsproblem, des angehängten Wortes: "Item" gelöst :-(
 

Antoras

Top Contributor
Reflection ist deshalb so langsam weil alles zur Laufzeit geschieht und nicht zur Compilezeit (wobei ich hier jetzt keine genaue Definiton von "langsam" geben möchte). Klar kannst du das mit Reflection lösen - in der Laufzeit des Programms wirst du deshalb keinen Unterschied spüren, zumindest nicht wenn du 1 Million Textfelder hast. Aber spätestens wenn du am Code was ändern oder ergänzen möchtest wirst du merken was für Probleme da auf dich zu kommen...

Wenn du viele Objekte hast, die angesprochen werden müssen und über die du nicht iterieren kannst, dann bleibt dir eben nichts anders übrig wie alle hardcodiert anzusprechen. Wenn dir das aber gar nicht bekommt, dann kann man sich da mit Maps bestimmt was zusammenbauen:
Code:
class ValueObject {
  Map<String, Type> m
  Type get(String s) {
    m.get(s)
  }
}

Map<String, TextField> map
// add all TextFields to map
method dataChanged(ValueObject o) {
  for (final Map.Entry<String, TextField> e : map.entrySet()) {
    e.getValue().set(o.get(e.getKey()))
  }  
}
Die Strings sind dann halt irgendwelche Konstanten oder ein Enum, mit denen man sowohl das Textfeld auf dem Client als auch die Daten auf dem Server ansprechen kann.
 

Andi_CH

Top Contributor
Vergiss das mit dem Anhängen und der Reflection einfach (oder besser gesagt endlich) mal - Java ist definitv nicht dazu gedacht zur Laufzeit Varablennamen zu generieren und Reflection ist, wie ja schon mehrfach angedeutet wurde, nicht das geeignete Mittel für dein Problem.

Immer wenn ich etwas von zig Variablen lese frage ich mich, warum nicht auf andere Datenstrukturen zurückgegriffen wird.

Das folgend ist Pseudocode - wenn du den nicht verstehst ist möglicherweise das ganz Problem zu komplex für dich und wir sollten das von Grund auf kennen und anpacken.

[EDIT] Hm, das tönt etwas harsch und könnte falsch verstanden werden - ich will dich weder beleidigen noch niedermachen, ich möhte nur sagen, dass da mit sehr grosser Sicherheit Designfehler vorliegen, die wir erst beheben sollten. [/EDIT]

Die Felder im Gui sowie die Variablen sollten in einem array, Vector oder was auch immer gespeichert sein.

Java:
JFeld[] feldArr = new JFeld[anzahl];
String[] werte = new STring[anzahl];
for (int i=0; i<anzahl; i++) {
      werte[i] = feldArr[i].getString();

und so kannst du auch zig tausend Felder auf wenigen Zeilen umkoipieren.

Wie gesagt - Pseudocode - versuche nicht das zu kompilieren, das wird nicht gehen.
 

onkelSuSE

Mitglied
ok! also dann entnehm ich aus dieser diskussion mal, das jedesmal wenn ich einen kunden lade und die variablen von der entity zum Vo umschiebe, oder umgekehrt, eine Reflection analyse der Klasse zu teuer wäre! ich sollte mir eher ein array oder map aller feld-namen und typen halten und das durchgehen oder?

hmm?? ok, wobei ich dann immernoch nich weiß, wie ich an die Inhalte der Variablen komme, ohne Reflection.
 

Andi_CH

Top Contributor
Du hast ein GUI - das GUI hat eine bekannte endliche Anzahl Felder und die kann man durchaus in einem Loop lesen, aber du gehst nicht auf meine Hinweise ein.

Ich verstehe dein eigentliches Problem nicht und du willst es irgendwie auch nicht wirklich erklären. Ich verabschiede mich aus diesem Thread.
 

onkelSuSE

Mitglied
jetzt versteh ich gar nichts mehr! ich wollte doch niemanden ärgern!

meine umgebung ist:

GWT ( Gui, JavaScript im Browser = Client )
JavaEE mit JPA auf jboss

und da muss ich für eine Datenbank tabelle ( entity ) namens Kunde mit sagen wir 50 feldern halten.

wenn ich auf dem client bin und sage: "hole Kunde Nr. 4711", dann geh ich zum Server und frag per jpa nach dem kunden. dann hab ich ein Entity-Objekt. wenn ich dieses wieder auf den client schicken will, macht man das mit einem value-Object. also mach ich manuell folgendes auf dem Server:

vo.setName(entiy.getName());
vo.setStrasse(entity.getStrasse());
vo.setPlz(entity.getPlz());
50 weitere...

auf dem Client wieder angekommen, muss ich die werte aus dem vo in eine gui ( smartgwt dynamicform ) schieben. also:

nameItem=vo.getName();
strasseItem=vo.getStrasse();
plzItem=vo.getPlz();
50 weitere...

und wenn ich ihn jetzt wieder speichern will, dann muss ich aus der gui wieder folgendes tun:

vo.setName(nameItem.getValue());
vo.setStrasse(strasseItem.getValue());
vo.setPlz(plzItem.getValue());

auf dem server angekommen, muss ich dann wieder die Werte aus dem Vo in die Entity stecken:

entity.setName(vo.getName());
entity.setStrasse(vo.getStrasse());
entity.setPlz(vo.getPlz());

und dafür brauch ich einen converter, weil ich diese getter,setter schieberei lästig finde!

bitte nich böse sein! is ja auch ziemlich komplex das ganze, zumindest für mich!
bin für jeden noch so kleinen hinweis dankbar!
ansonsten werd ich wohl nochmal :rtfm: müssen!
 

Antoras

Top Contributor
In den vorherigen Posts wurden dir bereits Lösungsvorschläge genannt. Lies die nochmal durch, versuche sie zu verstehen und umzusetzen.
 

schalentier

Gesperrter Benutzer
Mein Tipp waere, schreib die 50 Felder hin. Das ist am einfachsten und funktioniert. Ja, es ist haesslich. Aber du machst es genau einmal, dann ist gut. Wenn es wirklich extrem viele Felder sind, und sich alles moeglicherweise staendig aendert, bau dir einen ganz einfachen Generator, der dir diese Zuweisungen (bzw Setter Aufrufe) generiert (gaaanz einfach, FileWriter, String.format(..) und gut).

Edit: Funktioniert Reflection ueberhaupt mit GWT?
 

onkelSuSE

Mitglied
ich konnte ja nur die serverseite mit reflection abbilden, weil da die felder in vo und entity gleich sind! werds aber weiter versuchen um um diese tipparbeit herumzukommen. von mir aus mit maps und arrays und weiß der geier was sonst .... :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Lange Variablennamen schlechter Programmierstyle? Java Basics - Anfänger-Themen 4
P Variablen Variablennamen in der Ausgabe verweden Java Basics - Anfänger-Themen 4
E Variable in Variablennamen? Java Basics - Anfänger-Themen 6
vandread variablen in variablennamen? Java Basics - Anfänger-Themen 11
X Frage zu Variablennamen Java Basics - Anfänger-Themen 5
O VariablenNamen über Schleife ansprechen var[i] Java Basics - Anfänger-Themen 2
T Variablennamen automatisch erstellen Java Basics - Anfänger-Themen 6
M Variablennamen als Parameter gleich Var. als Klassenvariable Java Basics - Anfänger-Themen 2
W Objekt-Namen aus Variablennamen erstellen Java Basics - Anfänger-Themen 7
G Returnwert als Variablennamen benutzen Java Basics - Anfänger-Themen 6
R dynamische Variablennamen Java Basics - Anfänger-Themen 3
Y Dynamisch Variablennamen generieren? Java Basics - Anfänger-Themen 9
K Variable Menge an Variablennamen per Schleife erstellen Java Basics - Anfänger-Themen 10
M Schleifenindex in Variablennamen einbauen Java Basics - Anfänger-Themen 9
S Variablennamen aus Objekten lesen Java Basics - Anfänger-Themen 4
P Verketten, Aneinanderreihen von Strings Java Basics - Anfänger-Themen 2
M Verketten von Formularfelder im PDF-Formular Java Basics - Anfänger-Themen 0
P Java Verketten von Stream - Bedeutung der Anweisungen? Java Basics - Anfänger-Themen 3
Syncopated Pandemonium Verketten von Strings funktioniert nicht Java Basics - Anfänger-Themen 4
Kenan89 Methodenaufrufe verketten Java Basics - Anfänger-Themen 16
N Strings verketten Java Basics - Anfänger-Themen 3
S Konstruktoren verketten Java Basics - Anfänger-Themen 6
Developer_X jede Zeile einer Datei mit einem String verketten Java Basics - Anfänger-Themen 16

Ähnliche Java Themen

Neue Themen


Oben