Methoden key value Parameter

velo

Mitglied
Hallo,

ich bin auf der Suche nach der richtigen Java Lösung key/value Parameter zu nutzen. Genauer mein Problem:

Wenn eine Methode aufgerufen wird und ich die Reihenfolge und Anzahl der Parameter nicht festlegen will, dazu sollen auch manche optional sein und der Compiler soll schon vor der Laufzeit falsche Aufrufe erkennen - wie macht man das?

Die "..." Erweiterung für Parameter ist ja nett, aber die Auswertung bedarf einer Schleife mit Überprüfung zur Laufzeit. Eigene Objekte wäre möglich, aber das artet aus.


Also so und vielleicht ohne, dass die Reihenfolge entscheidend ist.
Java:
public void anyMethod ( Integer foo, String(optional) bar, ... )
 
Guckst du hier :

Optional Parameters

Was die Reihenfolge angeht:

Java:
public void anyMethod(Integer index, Object...objects){...}

dies bedarf dann Typprüfungen um auf verschiedene Parameter in dem Array zu reagieren.

du könntest auch einfach überladene Methoden anbieten 😉

z.B

Java:
public void anyMethod(Integer index){
 anyMethod(index, "");
}

public void anyMethod(Integer index, String key){
 ....
}
 
Zuletzt bearbeitet:
Danke, das mit den überladenen Methoden war mir klar und habe es vergessen zu erwähnen. Ist dann natürlich viel extra Code - unübersichtlich. Und wenn die Kombination kommt, potenziert sich die Anzahl.

Sehe ich das richtig, dass ihr meint, ich solle eine HashMap als Objekt übergeben?

Das dachte ich auch immer. Aber dann kann ich doch keine Typenprüfung vor der Laufzeit durchführen, oder? Und wie sieht es dann mit obligatorischen und optionalen Parametern aus (if/else?)?
 
... Aber dann kann ich doch keine Typenprüfung vor der Laufzeit durchführen, oder? ...
Doch, natürlich :autsch:
Java:
public static boolean isValid( Object obj, Class c ) {
	
	if ( obj.getClass() == c ) return true;
	else return false;
	
}

... Und wie sieht es dann mit obligatorischen und optionalen Parametern aus (if/else?)? ...
Wie wäre z. B. eine zweite HashMap<String, Boolean> :idea:
Oder aber du verwendest statt des Strings ein Enum :toll:
 
Jetzt bin ich verwirrt.

isValid muss man ja aufrufen - also während der Laufzeit. Wie meinst du das mit VOR der Laufzeit?
 
Wenn eine Methode aufgerufen wird und ich die Reihenfolge und Anzahl der Parameter nicht festlegen will, dazu sollen auch manche optional sein und der Compiler soll schon vor der Laufzeit falsche Aufrufe erkennen - wie macht man das?

...

Jetzt bin ich verwirrt.

Ich (wir?) auch ...

Der Compiler überwacht sehr genau ob die Typen der Paramter zu den Typen der Funktion passt.
Beliebige Reihenfolge der Paramter ist in Java nicht möglich
Beliebige Anzahl schon, aber alle müssen denselben Typ haben
Optionale Parameter gibt es nicht, allerdings kannst du ungültige Werte (z.B. "null" für eine Referenz übergeben)

Für Java ist ein String ein String und somit gleichwertig, da gibt es keine Reihenfolge..

Ein Beispiel in dem mich etwas überrascht - nämlich die Tatsache, dass sowohl Implementation 3 und 4 möglich sind.

Java:
public class Test {
	
	public static void doIt(String s, int i, boolean b) {
		System.out.println("Implementation 1");
	}

	public static void doIt(boolean b, String s, int i) {
		System.out.println("Implementation 2");
	}

	public static void doIt(String s1, String s2) {
		System.out.println("Implementation 3");
	}

	public static void doIt(String ... s1) {
		System.out.println("Implementation 4");
	}

	public static void main(String[] args) {
		// Implementation 1
		doIt("Hallo", 1, false);

		// Implementation 2
		doIt(true, "Hallo", 1);

		// Das gibt selbstverständlich einen Compilationsfehler,
		// da es keine Funktion mit diesem Parameterprofil gibt
		//  doIt(1, false, "Hallo");

		// Implementation 4
		doIt("Hallo", "Welt", "wie", "geht", "es", "dir");
		// logischerweise für den Compiler absolut identisch
		doIt("dir", "geht", "Welt", "es", "Hallo", "wie");

		// Implementation 3
		doIt("Hallo", "Welt");
	}
}
 
Danke für den ausführlichen Beitrag.

Einen optionalen Parameter gibt es scheinbar nicht.

Nun gut immerhin gibt es nun dieses "...", um mehr Werte anzugeben.

Ja, was soll ich sagen ... ich bin etwas enttäuscht von Java an dieser Stelle. Aber wer weiss, vielleicht tut sich da noch was. Immerhin gab es früher das mit "..." ja auch nicht.

Ich stellte mir das so so ähnlich vor, wie man auf der Kommandozeile Parameter zu einem Befehl angeben kann:

Code:
doit -x -more 123 -write "hello" -d -p -number 7

wobei eben die Kombination und Reihenfolge variieren können sollte. Aber trotzdem sollten die Typen geprüft werden. Dafür wird wohl eine eigene Klasse noch das Beste sein vermute ich, was dann aber bei der Verwendung echt übertrieben aussieht. Und wenn man das öfters braucht, dann ist es nicht mehr schön.
 
Nun gut immerhin gibt es nun dieses "...", um mehr Werte anzugeben.

Das hier nennt sich Varargs und bedeutet Variable Argumentenliste, hier wird aus einer Variablen länge an übergebenen Parametern, ein Array erstellt welches diese enthält.

gleichzusetzen in etwa mit der übergabe einer Arrays, nur das du hier keine bestimmte länge angeben musst und das Array selbst beim Kompilieren erzeugt wird, deshalb ja auch "variabel".

doit -x -more 123 -write "hello" -d -p -number 7

Das hier könnte man über Startparameter abarbeiten

sprich all dieses könntest du der main Methode übergeben und dann per Fallentscheidung dementsprechend Reaktionen auf verschiedene Parameter ausführst, ALLE Parameter werden hierbei als String übergeben, da main ebend ein String[] array als Parameter erwartet.

Java:
public static void main(String[] args){...}

ließe sich z.B so auswerten

Java:
public static void main(String[] args){

 for(String s : args){
  
   if(s.equals("-x"){
     //do something
   }
  if(s.equals("write"){
     //do something other
   }
....usw
 }
}

oder halt mit switch.....
 
Zuletzt bearbeitet:
Danke. Das mit der Kommandozeile war mehr eine Analogie, um zu zeigen was ich meine. Eigentlich wäre "doit" also eine Methode.

Aber an deinem Bespiel kann man ganz gut das Dilemma erkennen: "write" oder "x" können nur während der Laufzeit geprüft werden, da es Strings sind.
 
du könntest lediglich darauf reagieren wenn jemand Startparameter verwendet, und dann ggf. je nach Fall eine Bestimmte Methode ausführen .

z.B wenn jemand deine Applikation zwar von der Konsole Startet aber eine Gui nutzen möchte könntest du ihm über einen Startparameter so die Möglichkeit hierzu geben,

mir ist noch nicht ganz klar warum du dies zur laufzeit machen wollen würdest 😉
 

Neue Themen


Zurück
Oben