# Methode mit, vom aufrufenden Objekt abhängigen, Rückgabewert



## siwica (11. Jan 2009)

Hallo,

ich habe folgende Frage/Problem:

Ich habe ein Objekt x mit einer Methode getLala(). Nun wird diese Methode von verschiedenen anderen Objekten a, b, c,.. aufgerufen. Der Methodenaufruf x.getLala() soll nun in Abhängigkeit des Namen des aufrufenden Objektes (bzw. des Namens der dazugehörigen Klasse) veschiedene Werte zurückgeben.

z.B:
innerhalb der Klasse a soll für den Methodenaufruf gelten: x.getLaLa() == 1
innerhalb der Klasse b soll für den Methodenaufruf gelten: x.getLaLa() == 2
...

Eine Idee ist, dies über die Hashcodes zu realisieren, also beim Erzeugen der jeweiligen Objekte deren HashCodes zu speichern und dann die Methode zu x.getLala(long Hashcode) umzuändern, so dass jedes Objekt a, b, c... seinen eigenen Hashcode abfragt und diesen als Parameter (und quasi als Schlüssel) für die Methode getLala nutzt. 

Da ich die Methode getLala() jedoch gerne Parameterfrei hätte, suche ich nun eine andere Möglichkeit das zu realisieren. Evtl. gibt es ja eine Möglichkeit den Hashcode oder den Namen des aufrufenden Objekten innerhalb von x zu ermitteln, ohne das diese als Parameter übergeben werden muss?!

Vielen Dank für eure Hilfe!

Grüße,
Simon


----------



## SlaterB (11. Jan 2009)

ohne Parameter kannst du das genaue aufrufende Objekt nicht bestimmen,
sondern nur die Klasse und Methode und Zeilennummer so wie bei einem StackTrace einer Exception,

mit Thread.getStackTrace() bekommst du ein Objekt, welches du untersuchen kannst,

aber mit Objektorientierung hat das nix zu tun, das sollte man höchstens für ganz allgemeine Dinge wie Exceptionhandling oder Logging verwenden


----------



## siwica (11. Jan 2009)

Mir würde es auch genügen, wenn ich nur den Klassennamen des aufrufenden Objekts ermitteln könnte... Wäre das möglich?

Grüße,
Simon


----------



## SlaterB (11. Jan 2009)

hab ich das nicht eben beantwortet?
es ist wohl
Thread.getCurrentThread().getStackTrace()
statt
Thread.getStackTrace()


----------



## siwica (11. Jan 2009)

Ok, danke! Ja so würde es sicher gehen, auch wenn mir auch das nicht sonderlich elegant erscheint... Aber anscheinend gibt es ja keine anderen Möglichkeiten. Trotzdem Danke!!


----------



## Gast (11. Jan 2009)

Das ganze hört sich nach großem Blödsinn an. Warum versuchst du nicht die Ursache des Problems zu eliminieren anstatt so eine Krüppellösung zu verwenden (ich kann mir gar nicht vorstellen, warum sowas hier überhaupt vorgeschlagen wurde...).


----------



## Marco13 (11. Jan 2009)

Da gibt es offenbar unterschiedliche "Strömungen" in der Forengemeinde (nicht dieser hier, sondern allgemein). Wenn jemand fragt: "Jedes mal, wenn ich mit einer Kaffeetasse einen Nagel in die Wand haue, geht die Tasse kaputt - wie kann ich verhindern, dass die Tasse kaputt geht?" wollen einige tatsächlich solche Antworten wie "Nimm eine Tasse aus kohlefaserverstärktem Titan" oder "Such' dir eine weichere Wand", und nicht solche kritisch-hinterfragenden Tipps wie "Nimm' doch einfach einen Hammer".... :roll:


----------



## diggaa1984 (11. Jan 2009)

:lol:  der war gut


----------



## 0x7F800000 (11. Jan 2009)

ich glaub ich gehöre eher zur ersten kategorie: zum einen Krieg ich Ahnung von Titanverarbeitung  , zum anderen ist das lustiger als ständig nur "gug in FAQ" hinzuschreiben :lol:


----------



## siwica (11. Jan 2009)

Nachdem wir schon bis zur Titanverarbeitung abgeschweift sind, würde ich mich freuen wieder auf das Thema zurückzukommen...

Gibt es nun eine Lösung für das Problem (abgesehen von der bereits vorgeschlagenen, die mir jedoch sehr unschön erscheint)?
Oder lässt sich das ganze nur, wie von mir vorgeschlagen mit Zuhilfenahme der Hashcodes realisieren? Ich hätte jedoch schon ganz gerne eine Parameterfreie Methode...

Grüße,
Simon


----------



## Wildcard (11. Jan 2009)

Was eine Methode tut, oder auch nicht tut, sollte niemals abhängig vom Aufrufer sein. Aus gutem Grund findest du auf regulärem Weg auch nicht heraus wer dieser Aufrufer ist, das würde die Leute nur auf ganz schlechte Ideen bringen.
Überleg dir was anderes oder beschreib dein Problem im größeren Rahmen. Für die meisten Probleme existieren passende Musterlösungen (Design Patterns), allerdings müssten wir mehr über das Problem wissen um das Muster zu erkennen.


----------



## SegFault (12. Jan 2009)

Hmm was genau soll das angefrage eigentlich bringen? Warum gibts kein interface mit getLala als Funktionen welches die Klassen a,b,c implementieren müssen und dann den entsprechenden Wert liefern. Oder ähnliches. Mir fällt hier wirklich keine (Sinnvolle) Aufgabe für das Problem ein. 

Und ich glaube auf den Stacktrace zu zu greiffen mag ja vielleicht funktionieren ich gehe aber mal davon aus das es langsam ist, weil ja damit in die VM eingegriffen werden muss. Also maximal für Debugging zwecke verwendbar. 

Wenn du genauer sagst wozu das ganze dienen soll kann man dir vielleicht alternative Lösungsmöglichkeiten anbieten.


----------



## Leroy42 (12. Jan 2009)

Gast hat gesagt.:
			
		

> Das ganze hört sich nach großem Blödsinn an. Warum versuchst du nicht die Ursache des Problems zu eliminieren anstatt so eine Krüppellösung zu verwenden (ich kann mir gar nicht vorstellen, warum sowas hier überhaupt vorgeschlagen wurde...).



 :applaus:  :applaus:  :applaus:


----------



## voidee (12. Jan 2009)

entwickle halt ein Interface


```
public interface FncCallback {
  
  public Class getClassCaller();

}
```

dieses muss an "deine" Methode als Parameter mitübergeben werden


```
public Object getLala(FncCallback callback, ....) {
  String aufrufendeClass = callback.getClassCaller().getName();

  // ab hier die abängige Ermittlung
}
```

oder übergeb halt den "this"

Mal echt, man kann sich auch anstellen.


----------

