Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich suche wie man mehrere Eingabeparameter der Methode übergeben kann. Dabei steht vorher nicht die Anzahl der übergebenen Parameter fest.
--------------------------------------------------------------------------
Man könnte zwar einen Array übergeben, aber ich möchte gerne wissen wie es mit dieser Methode auch geht.
Vor einiger Zeit habe ich mal irgendwo gesehen, dass man es mit "String ...," oder so machen kann.
sorry, dass ich hier poste, aber ich habe seit dem letzten Log-In paar technische Probleme, inkl. die Erstellung eines neuen Thema
Meine Frage bezieht sich auch auf varargs. Und zwar sollen wir in einer Aufgabe im Konstruktor varargs verwenden und die vom Nutzer eingegebenen Argumenten in einem Array speichern.
Das wäre kein Problem, wenn es nicht explizit VERBOTEN wäre ein Array als ARGUMENT zu übergeben.
Wie geht man in diesem Fall vor?
Ich habe mir überlegt, die als varargs übergebenen Objekte zu zählen und dann in ein Array schon im Konstruktor-Rumpf zu speichern. Habe aber keine Idee, wie man hier das (Zählen von Argumenten) Syntaktisch realisieren kann.
Oder gibt's einen anderen etablierten Ansatz dafür?
Das Ganze ist doch recht Einfach. Bei VarArgs wird das Array durch die JVM vor dem Eintritt in die Methode aus den Argumenten gebildet. Innerhalb des Methodenrumpfes ist es halt ein Array. Es tut keinem weh, wenn man statt
Java:
public static void main(String[] args)
Java:
public static void main(String ... args)
schreibt. Aber man kann ja mal versuchen, die gewohnte Form der "main"-Methode mit variablen Parametern aufzurufen. Das geht nicht gut und genau so verhalten sich dann auch andere Methoden. Vor VarArgs (also pre 1.5) war man z.B. bei "String.format()" und anderen ein Array zu übergeben, welches man zuvor selbst erstellen durfte. Das macht nun seit Java1.5 die JVM für uns. VarArgs sind also zunächst erst mal keine Arrays, sondern beeinflussen nur die Arten, wie die Methode aufgerufen werden kann. Erwartet sie ein Array, kann man variable Parameter vergessen. Erwartet sie hingegen VarArgs, kann man sogar, wie gewohnt, ein Array übergeben oder aber halt einzelne Parameter.
Es gibt manchmal Konstrukte (z.B. CommandPattern), wo diverse Subklassen verschiedene Anzahl an Parametern brauchen. Die Superklasse (Command) definiert dann eine Methode
Java:
class Command {
public Object execute(Object ... args) throws Throwable {
// no implementation
}
}
und konkrete Klassen überschreiben diese mit Typen und Anzahl der benötigten Argumente.
Java:
class Load extends Command {
public File execute(String path) {
// load
throw new FileNotFoundException(path);
}
@Override
public Object execute(Object ... args) throws Throwable {
checkParameter(); // wirft ggf. Exception
return execute((String) args[0]);
}
}
In einer Engine lässt sich aus einer Command-Liste dann definitiv immer "<Command>.execute()" aufrufen[STRIKE] und wenn die Parameter passen (in diesem Fall String), wählt die JVM die passende Methode[/STRIKE] und die konkrete Klasse prüft die Parameter und ruft dann ihrerseits die korrekte Methode auf. Für deinen Fall wär's natürlich umgekehrt, die VarArgs-Methode müsste protegiert werden, damit sie von aussen nicht erreichbar ist. Die Aufrufe finden dann umgekehrt statt. Aber irgendwie fehlt mir ein Anwendungsfall dazu.
Es wird der Methode ja auch kein Array "übergeben", sondern einzelne Argumente. Dass auf diese dann als Array zugegriffen werden kann, ist ein ganz anderes Paar Schuhe (und so sieht es anscheinend auch der Aufgabensteller).
Bitte durch "Compiler" ersetzen. Varargs sind nichts anderes als syntaktischer Zucker. Zur Kompilierzeit "werden" der Formalparameter und die Aktualparameter jeweils ein Array. Im Bytecode sind Varargs von Arrays nur durch das method property flag [c]ACC_VARARGS[/c] zu unterscheiden.
@TE: Die Aufgabe ist daher ziemlich unklar. Kannst du sie hier wörtlich posten?
Bitte durch "Compiler" ersetzen. Varargs sind nichts anderes als syntaktischer Zucker. Zur Kompilierzeit "werden" der Formalparameter und die Aktualparameter jeweils ein Array. Im Bytecode sind Varargs von Arrays nur durch das method property flag [c]ACC_VARARGS[/c] zu unterscheiden.
Es wird der Methode ja auch kein Array "übergeben", sondern einzelne Argumente. Dass auf diese dann als Array zugegriffen werden kann, ist ein ganz anderes Paar Schuhe (und so sieht es anscheinend auch der Aufgabensteller).
@Spacerat: so habe ich das Prinzip auch verstanden, dass die einzelnen Argumenten, die der Methode übergeben werden,
durch "interne Magie" (sorry, ich weiß (NOCH) nicht, welche Prozesse danach ablaufen) in einem Array "abgelegt" werden.
Die Frage ist, wie kann ich im Rumpf der Methode oder im Konstruktor (in meinem Fall) diese Argumente, die als varargs übergeben werden in einem vorgegebenen Array speichern?
Sprich, mit den Elementen eines Arrays, der als Argument übergeben wird, wäre das so:
Java:
MeinKonstruktor(int [] elemente){
int [] meinArray = new int[elemente.length];
for (int i=0; i<elemente.length; i++){
meinArray[i]=elemente[i];
}
}
Meine Frage ist, wie mache ich das, wenn ich statt eines Arrays die einzelnen Argumente habe?
Java:
MeinKonstruktor(int [] elemente){
int [] meinArray = new int[elemente.length];
for (int i=0; i<elemente.length; i++){
meinArray[i]=?????????;//das geht doch nicht oder?
}
}
Die Antwort ist einfacher als du denkst... die da lautet: Genau so. Das ist ja der Geck. Der VarArgs-Operator ist nur für den Aufrufer wichtig, damit er weis, diese Methode will variable Argumente oder ein Array.
Innerhalb der Methode kannst du VarArgs ignorieren (Die 3 Punkte evtl. mit Tippex übermalen und 2 eckige Klammern drauf pinseln, nur den Quelltext darfst du nicht ändern. ) und die variable als Array verwenden. Kurz: "????????" durch "elemente" ersetzen.
Die Frage ist, wie kann ich im Rumpf der Methode oder im Konstruktor (in meinem Fall) diese Argumente, die als varargs übergeben werden in einem vorgegebenen Array speichern?