2017-01-31 3 views
-2

potenziell idiotisch Frage Vorsicht unter:Gibt die Anzahl der variablen Argumente einer Methode in Java

ich eine Methode, die die String.format() -Methode verwendet einen Text zu formatieren. Momentan erhält es zwei Parameter, also habe ich zwei "% s" -Parameter, um den gewünschten Text zu erzeugen.

Aber jemand könnte 3 Parameter oder 4 oder 100 mit meiner Methode verwenden möchten. Wie kann ich die Länge der übergebenen Parameter als varargs an die String.format() -Methode übergeben, so dass, falls 3 Parameter übergeben werden, 3 "% s" anstelle der aktuellen 2 davon vorhanden sind; oder 4 oder 100.

Wie können Sie die Anzahl der Parameter erhalten, die an die String.format() -Methode übergeben werden, sodass der darin enthaltene Text automatisch "% s" nach Bedarf hinzufügt? Weil die Argumente nur als reguläre Argumente übergeben werden, nicht als Arrays oder ähnliches. Wie erhalten Sie die Länge des Argumentarrays?

PS. Das ist wichtig - ich spreche nicht davon, die (String ... Argumente) zu erhalten - es gibt keine solche Sache - wenn jemand Ihre Methode aufruft, verwendet es tatsächliche Parameter, die "String ... arguments" steht nicht zur Verfügung und erhalte seine Länge.

Ich weiß, dies ist eine schlecht formulierte Frage, weil ich den Code nicht vor mir habe, um weiter zu erklären, aber das beschäftigt mich schon seit einiger Zeit - wie erhält man die Anzahl der Argumente, die man an a Methode?

Für diese so etwas wie:

String.format(SomeObject.SomeString, param1, param2,...,param 100) 

EDIT: Die SomeObject.SomeString wird wie folgt erklärt:

String SomeString = "Blah blah %s blah blah blah %s";

So hat es zwei Argumente, die in ihm fest einprogrammiert werden.

Wenn jemand es verwendet, wie passt man SomeObject.SomeString so an, dass es "weiß", wie viele Parameter an die String.format() -Methode übergeben wurden (so dass SomeObject.SomeString weiß, wie viele% s dynamisch hinzugefügt werden)?

+0

Wie ist es sinnvoll, die Anzahl der Parameter zu kennen, die an 'String.format' übergeben werden? Wenn Sie nicht die richtige Anzahl von Parametern für Ihre Formatzeichenfolge haben, erhalten Sie 'MissingFormatArgumentException'; Wenn du zu viele hast, wirst du die zusätzlichen sowieso nicht sehen. Sie können nur 'args.length' als expliziten Parameter für den Aufruf 'String.format' übergeben. –

Antwort

7

Da die Argumente als nur reguläre Argumente, nicht als Arrays übergeben werden.

Nein, werden die Werte als Array übergeben, damit Sie

public String myVarags(String... args) { 
    String s = ""; 
    for(int i = 0;i < args.length; i++) 
     s += "%s "; 
    return String.format(s, args); 
} 

schreiben könnte es eine String mit einem %s für jedes Argument erzeugen und formatieren Sie den String mit den angegebenen Werten. Es wird auch eine sehr dumme und nutzlose Methode sein.

Die Varargs Notation ist nur syntaktischer Zucker, es ist ein Array zur Laufzeit.

+0

Das ist genau das, was ich versuche zu sagen, dass es nicht passiert. Wenn jemand das verwendet, sagt es einfach "String.format (SomeObject.SomeString, param1)" oder es könnte sagen "String.format (SomeObject.SomeString, param1, param2)", ein tatsächliches Array ist nie so verfügbar Sie können seine Länge bekommen - es gibt nur regelmäßige Parameter. Wie erreichen Sie die Anzahl der Parameter der Methode, was ist der "Name" des Arrays, das diese Parameter enthält? Denken Sie daran, wir verwenden nur die Methode, deklarieren sie nicht oder irgendetwas anderes. –

+1

Ich bin nicht wirklich sicher, wie das die Frage überhaupt beantwortet. Er sagte speziell "PS. Das ist wichtig - ich spreche nicht über die Gewinnung der (String ... Argumente) - es gibt keine solche Sache - wenn jemand Ihre Methode aufruft, verwendet es tatsächliche Parameter". Er möchte 'SomeObject.SomeString' basierend auf den anderen an' String.format' übergebenen Argumenten modifizieren. – Adam

+0

Das ist genau richtig. Ich möchte die Anzahl der an die String.format() -Methode übergebenen Argumente ermitteln, um SomeObject.SomeString zu ändern und die Anpassung an die Anzahl der an die String.format() -Methode übergebenen Parameter vornehmen zu lassen. –

0

Ich glaube nicht, was Sie fragen, ist möglich, weil Ihre SomeObject.SomeString ist nur ein Argument, es weiß nichts über die anderen Argumente.Was Sie tun können, ist Ihre Argumente in ein Array von varargs drehen und ein Verfahren auf SomeObject schaffen die richtige Zeichenfolge zu generieren:

String[] args = ... 
String.format(SomeObject.createSomeString(args.length), args); 
+0

Ja, es ist eine wirklich seltsame Situation, ich frage mich auch, ob es überhaupt möglich ist. Meine Frage ist - gibt es eine Möglichkeit, die Anzahl der Argumente zu "zählen", die jemand an eine Methode weitergegeben hat? Wie gesagt, Sie haben Methode A (param1, param2, param3) - gibt es eine Möglichkeit in Java, die Information zu erhalten, dass diese Methode drei Parameter aufgerufen hat? Ist die Anzahl der Parameter, die eine Methode irgendwo "gespeichert" hat? –

+0

@RobertRuxandrescu Ja, Sie können '.length' auf dem variadischen Argument aufrufen. Es ist nur ein Array. –

+0

Ja, aber wie heißt das Array? Für die Methode A (param1, param2, param3), wie lautet der Name des Parameterarrays, das die Parameter enthält? –

3

Es klingt wie Sie die Anzahl der Parameter zugreifen möchten, die in eine andere übergeben werden Methode, die einen Vararg als Parameter verwendet (String.format() Methode).

Es ist nicht möglich zu wissen, wie viele Argumente an eine Methode übergeben werden, wenn Sie den Code in der Methode nicht ändern können. Und der String Parameter hätte sicherlich keine Ahnung wie viele Parameter übergeben wurden. Es ist ein völlig separates Objekt.

Das einzige, was Sie tun können, ist eine Wrapper-Methode zu erstellen. Sie können die gleichen varargs nehmen und sie dann an die String.format() Methode weiterleiten, die alle Änderungen vornimmt, die Sie tun möchten.

Dann muss Code, der String.format() aufruft, stattdessen Ihre Wrapper-Methode aufrufen.

Beispiel:

public String StringFormatWrapper(String...args) { 
    //perform actions on the args 
    if (args.length > 1) 
     args[1] = "Hello World"; 

    //call the String.format() method 
    return String.format(args) 
} 

Wenn Sie Zugang zu nicht haben, was String.format() dann ruft, was man unmöglich machen wollen, ist.

+0

Meine Ahnung gleitet auf die "es ist unmöglich" Seite der Dinge. –

+0

@RobertRuxandrescu Ich bin immer noch auf der Seite "Sie haben keine Ahnung, was Sie tun" Seite. Wenn du dich nur klar erklären könntest. – Kayaman

+0

Das liegt nur daran, dass ich den Code nicht vor mir habe. Ich sah es für eine kurze Zeit und ich reproduziere nur hier, woran ich mich erinnern kann. Die Hauptidee ist, dass ein String deklariert ist und die 'String.format()' Methode verwendet wird, für die das erste Argument SomeObject.SomeString ist, das für 2 Parameter fest codiert ist, und dann die Varargs für den Rest der Parameter in der 'String.format()' Methode. Also wird die endgültige Zeichenfolge das Ergebnis der fest codierten Zeichenfolge als der erste Parameter und alle anderen folgenden Parameter sein, die die hardcoded Zeichenfolge verwendet. –

-1

Ich habe darüber ein bisschen mehr nachgedacht und ich habe eine Lösung dafür gefunden, und die Lösung ist sehr einfach. In der Tat habe ich es in 5 Minuten geschrieben.

Hier ist, wie es geht:

Hauptklasse:

public class Main { 

    SomeObject someObject = new SomeObject(); 

    public static void main(String[] args) { 

     Main main = new Main(); 
     main.formatString("a","b","c","D","efesfs"); 

    } 

    public void formatString(String...varargs){ 
     String formattedString = String.format(someObject.returnFormattedString(varargs.length), varargs); 
     System.out.println(formattedString); 
    } 
} 

Someobject KLASSE:

public class SomeObject { 

    public String someString = "Blah blah blah"; 

    public String returnFormattedString(int numberOfArguments){ 
     for (int i = 0; i<numberOfArguments; i++){ 
      someString += "%s"; 
     } 

     return someString; 
    } 
} 

Mit anderen Worten, ich Einwickeln, dass alle Sachen in einem Verfahren, das haben Zugriff auf wie viele Parameter als Argumente übergeben werden, und ich werde die Anzahl von ihnen (als varargs.length) an die Methode innerhalb der SomeObject-Klasse übergeben, die die Länge als eine int-Variable nimmt Wenn Sie eine for-Schleife verwenden, werden so viele "% s" wie nötig hinzugefügt.

Es funktioniert wie ein Charme.

Ich weiß, dass einige Leute mich kritisiert haben, dass das nicht "richtig" ist, "es ist nicht die richtige Frage" und so weiter, aber es hat zumindest eine einfache Lösung, so wie ich es hätte haben sollen "Unmöglich", Sie müssen den Bytecode zur Laufzeit oder etwas Verrücktes nicht abbrechen.

+0

"Ihre" Lösung ist genau das, was Ihnen in buchstäblich jeder anderen Antwort hier vorgeschlagen wurde. – Kayaman

+0

Ja und Nein. Technisch gesehen hast du recht und es ist die gleiche Lösung, die ich bekommen habe. Aber meine ursprüngliche Frage war, ob ich die Anzahl der Argumente aus dem eigentlichen Aufruf der Methode bestimmen könnte, ohne eine neue zu schreiben und diese aufzurufen, wie Sie und ich. Also, ja. –

Verwandte Themen