Problem bei der Verkettung von Aufrufen

Carandiru

Mitglied
Hallo,
Ich möchte gerene eine Schatzkiste erstellen, in welche ich mittels verschiedenen Aufrufen eine bestimmte Art der Edelsteine (Smaragd, Rubin & Saphir) hinzufügen, löschen und ausgeben kann.

Die Schatzkiste.java sieht folgendermaßen aus

Java:
public class Schatzkiste{

    int Rubin, Smaragd, Diamant;


   public void print(){
      System.out.println(Rubin+Smaragd+Diamant);

   }

   public void empty(){
      Rubin = 0;
      Smaragd = 0;
      Diamant = 0;
   }
}

Die dazugehörige Test.java so:

Java:
public class Test{
   public static void main(String[] args){
      Schatzkiste sk = new Schatzkiste();
      sk.print();
   }
}

Soweit funktioniert die ganze Sache schon. Wenn ich allerdings die print() Funktion an die Initialisierung dranhänge, also:

Java:
      Schatzkiste sk = new Schatzkiste().print();

gibt der Compiler die Meldung aus, dass er aus der Funktion print einen Rückgabewert des Typs Schatzkiste erwartet.. Ich denk mal, dass mein Code nicht für Verkettung vorgesehen ist, also was mach ich falsch?
 
bin jetzt auch nicht der Java-Pro, aber ich frage mich was stört dich an Test.java? kann doch einfach so bleiben 😉

Das mit dem verketteten Aufruf geht nicht, weil erst die rechte Seite des Ausdrucks ausgewertet wird, also Objekt erzeugen und print() aufrufen und das Ergebnis in sk geschrieben werden soll. Dies geht aber nicht, weil sk vom Typ Schatzkiste ist und point() nichts zurückgibt.
 
So läuft es - die Reihenfolge bei dir war falsch. Du hast ein Objekt Schatzkiste gemacht, print aufgerufen und das Resultat von print (void) hätte der Variablen zugewiesen werden sollen

Die Klammern erzwingen die richtige Reihenfolge.

ALLERDINGS: ich würde so etwas NIE schreiben. Ich halte das für unleserlich.

Java:
	   public static void main(String[] args){
		      Schatzkiste sk;
		      (sk = new Schatzkiste()).print();
		   }
}
 
Zuletzt bearbeitet:
Entweder wie bereits verwendet:
Java:
Schatzkiste sk = new Schatzkiste();
sk.print();
oder
Java:
new Schatzkiste().print();
Wobei bei letzterm die Instanz der Schatzkiste nur für diesen einen Aufruf existiert und bei nächster Gelegenheit vom GarbageCollector aus dem Arbeitsspeicher gelöscht wird.
 
Also dann funktioniert das so nicht...ok 🙂
Wenn ich jetzt gleich einen Stein hinzufügen möchte, also
Java:
add(Edelstein.Diamant, 1);
wie genau müsste dann die add Funktion aussehen?

Java:
public void add(Edelstein art, int e){
      this.art += e;
   }
art habe ich vorher als int initialisiert und
Java:
public enum Edelstein {Diamant, Rubin, Smaragd}
unter Edelstein.java gespeichert. Wenn ich jetzt mittels sk.add(Edelstein.Rubin, 2); zwei Rubin hinzufügen möchte, tut sich allerdings nichts.
 
tut sich allerdings nichts
mhn klar ... das funktioniert aber so nicht...
add(Edelstein art, int e){
this.art += e;

das this.art ist etwas anderes als art... du duplizierst beim aufruf den primitiven datentyp und veränderst dann ... ich weiß gar nicht was du da veränderst...
wie sieht dein ganzer code aus und was hast du eigentlich vor...
 
gibt der Compiler die Meldung aus, dass er aus der Funktion print einen Rückgabewert des Typs Schatzkiste erwartet.. Ich denk mal, dass mein Code nicht für Verkettung vorgesehen ist, also was mach ich falsch?

ja grundsätzlich funktioniert das schon, wenn du Aufrufe hintereinander reihen willst, muss die aufgerufene Methode das Objekt zurück geben... kein problem mach das einfach...

beispiel

Java:
public class Test {

	public static void main(String[] args) {
				
		Test t = new Test().doSometing().doSometing().doSometing();

	}
	
	public Test doSometing(){
		System.out.println("did something");
		return this;
	}
}
 
ja grundsätzlich funktioniert das schon, wenn du Aufrufe hintereinander reihen willst, muss die aufgerufene Methode das Objekt zurück geben... kein problem mach das einfach...

beispiel

Java:
public class Test {

	public static void main(String[] args) {
				
		Test t = new Test().doSometing().doSometing().doSometing();

	}
	
	public Test doSometing(){
		System.out.println("did something");
		return this;
	}
}

Ja, danke sowas hab ich gesucht, also hat bei mir nur return gefehlt.

Aber jetzt möchte ich einen Stein hinzufügen, nach diesem Prinzip -> add(Edelstein.Diamant, 1);
Allerdings fehlt mir dazu die jeweilige Funktion, die erkennt, um welchen Stein (Smaragd, Rubin, Diamant) es sich handelt und jeweilige Variable um den Wert erhöht. Mein Lösungsansatz funktioniert ja nicht, dass es sich um unterschiedliche Typen handelt..🙂
 
schau dir mal HashMap an.
als Key benutzt du dein Enum, und Value ist einfach die Anzahl...

Ja ok, das wäre möglich, sieht aber ziemlich kompliziert aus :\
Gibts da nicht ne Lösung àla
Java:
public Schatzkiste add("Stein, den ich hinzufügen möchte", "Anzahl der Steine"){
       jeweiligerStein += Anzahl der Steine;
       return this;
   }
?
 
jeweiligerStein += Anzahl der Steine;

ist ja die Kurzform von: [c]jeweiligerStein = jeweiligerStein + AnzahlDerSteine[/c] was ja so ungefähr
[c]birnen = birnen + äpfel[/c] entspricht. Guck dir mal an was ARadauer dir empfohlen hat, das ergibt
schon mehr Sinn. Und du willst ja schließlich was dazulernen, nicht wahr?
 
Ja ok, das wäre möglich, sieht aber ziemlich kompliziert aus :\
warum?

Gibts da nicht ne Lösung àla
doch... HashMap....

Java:
import java.util.HashMap;

public class Test {
	public enum Edelstein {Diamant, Rubin, Smaragd} 
	
	HashMap<Edelstein, Integer> kiste = new HashMap<Edelstein, Integer>();
	
	public static void main(String[] args) {
		Test test = new Test();
		test.addSteine(Edelstein.Rubin, 3);
		test.addSteine(Edelstein.Diamant, 3);
		test.addSteine(Edelstein.Rubin, 2);
		
		System.out.println("ich habe "+test.getAnzahl(Edelstein.Rubin)+" Rubine");
		
	}
	
	public void addSteine(Edelstein stein, int anzahl){
		Integer vorhanden = kiste.get(stein);
		if(vorhanden == null)
			vorhanden = 0;
		kiste.put(stein, vorhanden+anzahl);
		
	}
	
	public int getAnzahl(Edelstein stein){
		Integer vorhanden = kiste.get(stein);
		if(vorhanden == null)
			return 0;
		return vorhanden;
	}	

}
 
Ah, vielen Dank 😉 Und die get & put Funktionen muss ich dann noch hinzufügen, oder wo kommen die her?
/Edit: Grade bin ich etwas verwirrt. Das Enum kann ich doch in der Edelstein.java lassen, oder? Und da ich 2 Klassen haben, also noch die Klasse Schatzkiste, müsste ich die Funktionen doch darein schreiben (inklusive der HashMap) oder?
 
Zuletzt bearbeitet:
Du kannst das ganze auch mit ner ganz ordinären switch-case-abfrage regeln:
Java:
public static final int SMARAGD = 0;
public static final int Rubin = 1;
public static final int SAPHIR = 2;
public void addSteine(int stein, int anzahl){
    switch(stein){
        case 0:
            this.smaragd += anzahl;
            break;
        case 1:
            this.rubin += anzahl;
            break;
        case 2:
            this.saphir += anzahl;
            break;
    }               
}
Aufruf:
Java:
add(Edelstein.SMARAGD, 1);
ungetestet, aber vom Prinzip natürlich richtig.
 

Zurück
Oben