{"id":1470,"date":"2012-07-27T11:49:02","date_gmt":"2012-07-27T09:49:02","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1470"},"modified":"2012-07-27T11:49:02","modified_gmt":"2012-07-27T09:49:02","slug":"inselupdate-methode-mit-variabler-argumentanzahl-vararg","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2012\/07\/inselupdate-methode-mit-variabler-argumentanzahl-vararg\/","title":{"rendered":"Inselupdate: Methode mit variabler Argumentanzahl (Vararg)"},"content":{"rendered":"<p>Bei vielen Methoden ist es klar, wie viele Argumente sie haben; eine Sinus-Methode bekommt nur ein Argument, equals(Object) ein Objekt, println(\u2026) nichts oder genau ein Argument, usw. Es gibt jedoch Methoden, bei denen die Zahl mehr oder weniger frei ist. Ein paar Beispiele:<\/p>\n<p>\u00b7 Wenn der Aufruf System.out.printf(formatierungsstring, arg1, args2, arg3, \u2026) etwas auf dem Bildschirm ausgibt, ist erst einmal nicht bekannt, wie viele Argumente die Methode besitzt, denn sie sind abh\u00e4ngig vom Formatierungsstring.<\/p>\n<p>\u00b7 F\u00fcgt Collections.addAll(sammlung, elem1, elem2, elem3, \u2026) etwas einer Sammlung hin, ist frei, wie viele Elemente es sind.<\/p>\n<p>\u00b7 Wird ein Pfad f\u00fcr das Dateisystem zusammengebaut, ist vorher unbekannt, wie viele Segmente Paths.get( anfang, segment1, segment2, \u2026 ) besitzt.<\/p>\n<p>\u00b7 Startet new ProcessBuilder(&quot;kommando&quot;, &quot;arg1&quot;, &quot;arg1&quot;, \u2026).start() ein Hintergrundprogramm, ist der Methode unbekannt, wie viele Argumente dem externen Programm \u00fcbergeben werden. <\/p>\n<p>Um die Anzahl der Parameter beliebig zu gestalten, sieht Java Methoden mit variabler Argumentanzahl, auch Varargs genannt, vor.<\/p>\n<p>Eine Methode mit variabler Argumentanzahl nutzt die Ellipse (\u00bb&#8230;\u00ab) zur Verdeutlichung, dass eine beliebige Anzahl Argumente angegeben werden d\u00fcrfen, dazu z\u00e4hlt auch die Angabe keines Elements. Der Typ f\u00e4llt dabei aber nicht unter den Tisch; er wird ebenfalls angegeben.<\/p>\n<p><strong>System.out.printf() nimmt eine beliebige Anzahl von Argumenten an<\/strong><\/p>\n<p>Eine Methode mit Varargs haben wir schon einige Male verwendet: printf(\u2026). Die Deklaration ist wie folgt:<\/p>\n<p>class java.io.PrintStream extends FilterOutputStream implements Appendable, Closeable<\/p>\n<p>PrintStream printf(String format, Object&#8230; args)   <br \/>Nimmt eine beliebige Liste von Argumenten an und formatiert sie nach dem gegebenen Formatierungsstring format.<\/p>\n<p>G\u00fcltige Aufrufe von printf(\u2026) sind demnach:   <\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td valign=\"top\" width=\"279\">\n<p>Aufruf<\/p>\n<\/td>\n<td valign=\"top\" width=\"279\">\n<p>Variable Argumentliste<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"279\">\n<p>System.out.printf(&quot;%n&quot;)<\/p>\n<\/td>\n<td valign=\"top\" width=\"279\">\n<p>ist leer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"279\">\n<p>System.out.printf(&quot;%s&quot;, &quot;Eins&quot;)<\/p>\n<\/td>\n<td valign=\"top\" width=\"279\">\n<p>besteht aus nur einem Element: &quot;Eins&quot;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"279\">\n<p>System.out.printf(&quot;%s,%s,%s&quot;, &quot;1&quot;, &quot;2&quot;, &quot;3&quot;)<\/p>\n<\/td>\n<td valign=\"top\" width=\"279\">\n<p>besteht aus drei Elementen: &quot;1&quot;, &quot;2&quot;, &quot;3&quot;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Maximum eines Feldes finden<\/strong><\/p>\n<p>Die Klasse java.lang.Math sieht eine statische max(\u2026)-Methode mit zwei Argumenten vor, doch grunds\u00e4tzlich k\u00f6nnte die Methode auch beliebig viele Argumente entgegennehmen und von diesen Elementen das Maximum bilden. Die Methode k\u00f6nnte so aussehen:<\/p>\n<p>static int max( int&#8230; array ) {   <br \/>}<\/p>\n<p>max(\u2026) behandelt den Parameter array wie ein Feld. Da wir Argumente vom Typ int fordern, ist array vom Typ int[] und kann so zum Beispiel mit dem erweiterten for durchlaufen werden:<\/p>\n<p>for ( int e : array )   <br \/> &#8230;<\/p>\n<p>Werden variable Argumentlisten in der Signatur definiert, so d\u00fcrfen sie nur den letzten Parameter bilden; andernfalls k\u00f6nnte der Compiler bei den Parametern nicht unbedingt zuordnen, was nun ein Vararg und was schon der n\u00e4chste gef\u00fcllte Parameter ist:<\/p>\n<p>public class MaxVarArgs {<\/p>\n<p>&#160; static int max( int&#8230; array ) {   <br \/>&#160;&#160;&#160; if ( array == null || array.length == 0 )    <br \/>&#160;&#160;&#160;&#160;&#160; throw new IllegalArgumentException( &quot;Array null oder leer&quot; );    <br \/>&#160;&#160;&#160; int currentMax = Integer.MIN_VALUE;    <br \/>&#160;&#160;&#160; for ( int e : array )    <br \/>&#160;&#160;&#160;&#160;&#160; if ( e &gt; currentMax )    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; currentMax = e;    <br \/>&#160;&#160;&#160; return currentMax;    <br \/>&#160; }    <br \/>&#160; public static void main( String[] args ) {    <br \/>&#160;&#160;&#160; System.out.println( max(1, 2, 9, 3) );&#160;&#160;&#160;&#160; \/\/ 9    <br \/>&#160; }    <br \/>}<\/p>\n<p><strong>Tipp: Vararg-Design<\/strong>. Muss eine Mindestanzahl von Argumenten garantiert werden \u2013 bei max(\u2026) sollten das mindestens zwei sein \u2013 ist es besser, eine Deklaration wie folgt zu nutzen: max(int first, int second, int\u2026 rest).<\/p>\n<p><strong>Compiler baut Array auf<\/strong><\/p>\n<p>Der Nutzer kann jetzt die Methode aufrufen, ohne ein Feld f\u00fcr die Argumente explizit zu definieren. Er bekommt auch gar nicht mit, dass der Compiler im Hintergrund ein Feld mit vier Elementen angelegt hat. So \u00fcbergibt der Compiler:<\/p>\n<p>System.out.println( max( new int[] { 1, 2, 9, 3 } ) );<\/p>\n<p>An der Schreibweise l\u00e4sst sich gut ablesen, dass wir ein Feld auch von Hand \u00fcbergeben k\u00f6nnen:<\/p>\n<p>int[] ints = { 1, 2, 9, 3 };   <br \/>System.out.println( max( ints ) );<\/p>\n<p><strong>Hinweis. <\/strong>Da Varargs als Felder umgesetzt werden, sind \u00fcberladene Varianten wie max(int&#8230; array) und max(int[] array), also einmal mit einem Vararg und einmal mit einem Feld, nicht m\u00f6glich. Besser ist es hier, immer eine Variante mit Varargs zu nehmen, da diese m\u00e4chtiger ist. Einige Autoren schreiben auch die Einstiegsmethode main(String[] args) mit variablen Argumenten, also main(String\u2026 args). Das ist g\u00fcltig, denn im Bytecode steht ja ein Array.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei vielen Methoden ist es klar, wie viele Argumente sie haben; eine Sinus-Methode bekommt nur ein Argument, equals(Object) ein Objekt, println(\u2026) nichts oder genau ein Argument, usw. Es gibt jedoch Methoden, bei denen die Zahl mehr oder weniger frei ist. Ein paar Beispiele: \u00b7 Wenn der Aufruf System.out.printf(formatierungsstring, arg1, args2, arg3, \u2026) etwas auf dem [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-1470","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1470","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=1470"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1470\/revisions"}],"predecessor-version":[{"id":1471,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1470\/revisions\/1471"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1470"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1470"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}