Oder aber in Verwendung um ein Objekt an zu legen..
Code:
create("NewPage");
private void create(String np) {
// Und dieses Zeichen was ich vor np machen müsste um den Inhalt voran zu stellen brauche ich
np variable = new np();
}
Solche Fragen kommen häufiger, und lassen sich meistens mit Collections und zur Not Reflection beantworten, daher die Frage:
Was genau willst du machen?
machen.. Ich möchte den Inhalt von np nutzen.. Wie nennt man das denn..
Sozusagen:
Code:
class Klasse {
public Klasse() {
}
}
class irgendwas {
public createirgendwas() {
String string = "Klasse";
create(string);
}
public create(String string) {
// so und hier möchte ich den Namen der im String versteckt ist nutzen um ein Objekt auf die Klasse "Klasse" zu erzeugen..
// In Tcl/TK z.B. hätte das ganze so ausgesehen $string = new $string();
(irgendeinzeichen??)string objekt = new (irgendeinzeichen??)string();
}
}
Ich sag's mal so, das geht zwar mit Reflection, jedoch solltest du versuchen mir zu erklären wofür du das denn brauchst, den Reflection wird nur in sehr speziellen Fällen benutzt, und meistens gibt es eine wesentlich elegantere Lösung :wink:
wtf ist Tcl/TK?
Tcl/Tk ist eine Kombination aus der Skriptsprache Tcl und einem graphischen Toolkit Tk. Darauf sollte sich dein Wissen darüber auch beschränken. Ist Ewigkeiten her, dass mich damit rumgeschlagen habe.
Ja ich bin auch froh von Tcl/Tk weg zu sein.. :wink: Obwohl ich manche Eigenschaften doch schon vermisse..
@raiL
Genau dynamische Variablennamen..
In dem Beispiel ist es nur ein Name, aber da wo ich es brauchen würde gibt es mehr Namen.. :wink:
Wofür ich das brauche.. Ich dachte mir das ich mir zum einen etwas Platz und Aufwand spare wenn ich nicht jede Variable einzeln setzen muss und das mit den Objekten ist noch was ganz anderes..
Ich habe eine GUI und eine Logik und noch eine Abkapselung der Logik mit eigenständiger Logik.. Und diese Abkapselung soll über die Hauptlogik die GUI aufrufen ohne sie direkt anzusprechen.. ABER da fällt mir gerade was besseres ein für diese Lösung.. :wink: Stimmt wäre zum umständlich gewesen.. Wenn man drüber spricht dann fällt einem meistens etwas ein... *freu*
Vielleicht lebe ich noch zu sehr in Tcl.. Denn dort konnte man sich das eben schön einfach machen ein paar Variablen zu setzen.. :lol:
:###
Edit:
Achso und ich rede nicht von ein paar Variablen sind immer jeweils ca. 30 Variablen die einzeln gesetzt werden müssen aber immer durch Aufruf einer Funktion nur mit unterschiedlichen Werten.. Deswegen dachte ich ich fülle mir ein Array mit den Variablennamen.. Lasse eine Schleife durchlaufen, erhöhe den Wert von Y und setze die Variable anhand des strings.. In Tcl ging das wunderbar... Zum auswerten usw. dann natürlich nicht mehr.. Aber zum setzen aller Variablen ist das natürlich viel praktischer...
So was löst man in der Regel mit einer Collection. Du legst also eine Collection von dem Typ deiner Variablen an. Die krieg dann einen Namen. Alle tatsächlichen Objekte werden dann in dieser Collection angelegt. Bekommen also keinen eigenen Namen, sondern werden über den Namen der Collection und den Index innerhalb der Collection angesprochen.
Statt Collection geht natürlich auch ein Array.
Edit: Im Grunde ist das deiner Lösung nicht so unähnlich. Nur noch etwas einfacher. Denn statt die Variablennamen in ein Array zu packen, packst du gleich die ganzen Objekte rein.
danke.. Nur weiß ich gerade nicht genau was du meinst..
Ich habe selber noch etwas probiert doch irgendwie habe ich da einen Denkfehler drin:
Ich habe verschiedene Dinge ausprobiert:
Code:
Stack st = new Stack();
st.addElement(new Location());
/.....
for (int i = 0; i < st.size(); i++) {
st.get(i).//und hier würde ich gerne die Funtkion getbutton() ausrufen die u.a. in Location drin steckt..
}
Und dann hatte ich noch folgenden Versuch gestartet:
Code:
AllCategory[] allc = createCategory();
for (int i = 0; i < allc.length; i++) {
// In einer Ausgabe sehe ich mein Objekt
//allc[i].//Aufruf der Funktion aber er tut es nicht
}
//...
AllCategory[] createCategory() {
return new AllCategory[] {
new Location(this),
new Cable(this),
//usw.
};
}
Das Problem ist, dass dein Stack untypisiert ist. Er speichert Objekte vom Typ Object, nicht vom Typ Location. Aus diesem Grund musst du beim Auslesen der Objekte casten. Aus deinem Code wird also:
Code:
Stack st = new Stack();
st.addElement(new Location());
/.....
for (int i = 0; i < st.size(); i++) {
Location loc= (Location) st.get(i);
loc.getbutton();
}
oder noch kürzer:
Code:
Stack st = new Stack();
st.addElement(new Location());
/.....
for (int i = 0; i < st.size(); i++) {
((Location) st.get(i)).getbutton();
}
Wobei zu Anfang die erste Variante besser ist, weil leichter lesbar.
Weitere Möglichkeit ist der Einsatz von Generics. Wenn du diese nicht aus irgendwelchen Gründen vermeiden musst, ist das auch zu empfehlen, damit hast du genau diese Typisierung und brauchst nicht casten:
Code:
Stack<Location> st = new Stack<Location>();
st.addElement(new Location());
/.....
for (int i = 0; i < st.size(); i++) {
st.get(i).getbutton();
}