Java - How, um "anonyme" Klasse on-the-fly
Kann ich dies tun:
new Object(){
public void hi(){}
}.hi();
wie kann ich (oder kann ich) tun Sie dies:
IWouldRatherStayAnonymous t = new IWouldRatherStayAnonymous extends Thread(){
public void NoNoYouCantCallMe(String s){}
};
t.NoNoYouCantCallMe("some useful data that i will need later, but don't want to save this anonymous class");
und wenn ich nicht syntaktisch dies tun, kann jemand erklären, die Logik/Umsetzung design, warum dies nie funktionieren würde?
==========================================
Edit: Erklärungen - die würde ich gerne erstellen, eine anonyme Klasse, ohne es zu speichern, und dann instanziieren eine Instanz der anonymen Klasse. Ich brauche nur 1 Referenz, da ich nicht über die Verwendung dieser Verweis oft (noch will ich irgendetwas anderes noch in der selben äußeren Klasse verwendet werden). Jedoch, ich möchte einfach nur gerne einige Daten zu dieser anonymen Klasse nur einmal (im Idealfall den Konstruktor, aber Sie werden feststellen, dass kann man eigentlich nicht überschreiben den Konstruktor Thread()).
Es ist wirklich keine GROßE Sache, ich war nur neugierig, ob das machbar war, aber es scheint aus den Antworten, dass es machbar ist, aber eben nicht sehr hübsch.
- Entfernen Sie die Worte
MyThread extends
und das wird funktionieren. Natürlich, es wird nicht alles noch. - Noch wichtiger ist, WARUM wollen Sie nicht zu "retten" die Klasse?
- speichern bedeutet, dass es versehentlich an anderer Stelle verwendet, die von jemand anderem, wer könnte Durcheinander zu bringen, für einen bestimmten anonymen Klasse, ich weiß, für eine Tatsache, die nur einmal verwendet werden, von mir nur. (das ist nicht, dass große Sache, da Stimme ich zu, aber ich war nur neugierig)
- Warten, so müssen Sie auch eine Schnittstelle implementieren oder nicht? Basierend auf Ihrem neuesten Bearbeiten Sie Ihre eigentliche Frage ist, wie, um benutzerdefinierte Daten in Ihrem anonymen Klasse. Oder ist es beide Aspekte?
- keine Notwendigkeit für Schnittstellen-Implementierung, obwohl es kann notwendig sein, später, um in der Lage sein, etwas zu tun, zusätzlich zu, nur die Daten zu speichern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage ist ein wenig verwirrend, aber es klingt wie Sie wollen, eine Klasse, die sowohl extends
Thread
und implementiert einige interface, aber das kann nicht von außen zugänglich von der Methode verwendet wird (die in der Regel sogar private geschachtelte Klassen). In diesem Fall verwenden Sie eine lokale Klasse:EDIT: Antwort auf Ihr update haben, können Sie natürlich geben Sie die lokale Klasse einen Konstruktor auf und übergeben Sie Daten, oder lassen Sie es einfach in der Nähe über
final
Variablen der äußeren Methode.Kann ich erklären. Wenn Sie einen Ausdruck
foo.bar(...)
in Java, der compiler muss sicherstellen, dass die statisch (compile-Zeit) Art des Ausdrucksfoo
unterstützt die Methodebar()
. In Ihrem ersten Fall, der Ausdruck auf der linken Seite ist die anonyme Klasse die Schöpfung Ausdruck, so dass seine statische Typ anonyme Klasse mit der Methode.Jedoch in Ihrem zweiten Fall, der Ausdruck auf der linken Seite eine variable ist. Der statische Typ einer Variablen ist der Datentyp, den die variable deklariert wurde, mit. In Java werden Variablen deklariert werden müssen, mit einer expliziten Typ (keine
var
oderauto
wie einige andere Sprachen). Daher, Ihrer statischen Typ muss es sich um einen benannten Typ.Thread
und keinen anderen Namen geben, unterstützt die MethodeNoNoYouCantCallMe()
; nur die anonyme Klasse unterstützt diese Methode, und Sie kann nicht deklarieren Sie eine variable des anonymen Klasse Typ. Das ist, warum es ist nicht syntaktisch möglich ist.Dies ist einfach. Sie müssen nicht explizit die übergabe der Daten in die anonyme Klasse, weil im inneren anonymen Klassen und lokalen Klassen, die Sie automatisch Zugriff auf
final
Variablen aus dem umgebenden scope. Also anstatt die Daten, die Sie direkt verwenden-Daten von außen.Gibt es zwei Möglichkeiten, auf die Methode der anonymen Klassen:
Java funktioniert keine Möglichkeit, die Erfassung der Typ der anonymen Klasse statisch, z.B. in einer Art und Weise ähnlich zu C#'s
var
Stichwort.In Ihrem Fall, Sie können erstellen eine abstrakte Art, mit der
void NoNoYouCantCallMe(String)
- Methode, und verwenden Sie diese Klasse als Basis für Ihre anonyme Klasse, wie folgt:Können Sie eine innere Klasse, nur Mach es nicht anonym. Anonym bedeutet, dass du nicht ein Typ für ihn.
Ich würde vorschlagen, entweder eine benannte innere Klasse oder zweiter Klasse in der gleichen Datei. Ich benutze die zweite sehr oft, nur es kann nicht öffentlich sein.
Wenn Sie wirklich wollte etwas tun, obszön, ohne Verwendung einer Schnittstelle oder einer abstrakten Klasse, Sie können es nennen, über Reflexion:
Aber das ist sinnlos... Es ist viel besser, mit einer einfachen Lösung mit einem interface oder einer abstrakten Klasse, so wie andere vorgeschlagen.
Können Sie die übergabe der Daten an eine anonyme innere Klasse, die mit freien Variablen erfassen, deklarieren Sie alle Variablen, deren Werte Sie aufnehmen möchten, wie
final
:Ist eine option, zu erklären, eine einheitliche, abstrakte Klasse, dass anonyme Klassen implementieren können: