Erstellen Sie eine Java-Annotation mit kontextabhängigem IDE-Verhalten

8

Ich habe eine Anmerkung erstellt

%Vor%

Ich benutze dies für Methoden, die wie folgt aussehen:

%Vor%

Die Variable v wird vom Android-Reflexionssystem benötigt, um diese Methode aufzurufen. Allerdings ist die Eingabe var v unbenutzt, daher warnt mich meine IDE davor. Ich mag diese Warnung und möchte sie für den Rest meines Codes verwenden .

Um die Warnung zu verbergen, konnte ich

tun %Vor%

oder ich könnte ein param-Tag hinzufügen

Aber ich würde lieber, dass die IDE (Eclipse) liest meine% Co_de% Annotation und gibt mir keine Warnung.

Ich weiß Sie können eine Anmerkung nicht erweitern , aber das ist im Grunde, was ich tun möchte.

Gibt es eine Möglichkeit, meine Annotation hinzuzufügen, um als "unterdrücken Warnungen "Annotation.

oder

Gibt es eine Möglichkeit, meine Annotation so zu programmieren, dass sie sich wie "Warnungen unterdrücken" verhält?

    
Blundell 26.11.2012, 11:22
quelle

3 Antworten

3

Ok, ich kann das nicht auf einfache Art und Weise machen.

Blick auf das Annotationspaket Ссылка

Ich kann eine Anmerkung nicht erweitern: Warum können Anmerkungen in Java nicht erweitert werden?

Ich kann keine weitere Annotation implementieren java.lang.Override

Ich kann nicht nachahmen / vortäuschen / vorgeben, @Override

zu sein

Wenn ich @Override zu meinem @FromXML hinzufüge, wird es NICHT in der Kette vererbt.

Der einzige Weg wäre, ein Eclipse-Plugin zu erstellen, das meine Anmerkung erkennt und die Warnung stoppt. Schade, weil ich keinen einfachen Weg finde, dies zu tun.

Ich habe auch den Weg zum Erstellen eines Interface für meine @FromXML -Einstiegspunkte gewählt, das war sehr nett und teilte mir mit, dass Activity von einem Typ ist und ich daher die Annotation nicht mehr brauche, vielleicht diese Designänderung ist die Antwort.

    
Blundell 05.12.2012, 09:56
quelle
11

Sie können immer ein Plugin für Eclipse erstellen, das die Quelle durchsucht und diese Annotationen in Ihrem Fall @FromXML findet und eine zusätzliche Annotation in Ihrem Fall @SuppressWarnings hinzufügt.

Sie könnten einen Befehl dafür erstellen und wenn dieser Befehl ausgelöst wird, würden Sie dieses Plugin ausführen.

Eclipse-Plugin erstellen

Hoffe, das hilft.

AKTUALISIEREN - ES WAR EIN FLUKE KANN NICHT MIT DIESEM GEBRAUCHT WERDEN (VERSUCHT):

Oder Verwenden von AspectJ zum Entfernen der Warnungen Hinzufügen von Warnungen in Eclipse mit AspectJ

Dieses Tutorial verwendet AspectJ zum Hinzufügen von Warnungen zu Eclipse, wenn der Entwickler System.out.println() im Code verwendet. Das Umgekehrte kann also gemacht werden, um die Warnung zu entfernen wenn Annotation vorhanden ist.

UPDATE 2: Es gibt in Eclipse eine Möglichkeit, einen benutzerdefinierten Annotationsprozessor zu erstellen oder den Annotationsprozessor zu bearbeiten (der die Warnung für nicht verwendete Variablen generiert). Also muss dieser Prozessor auf eine bestimmte Art und Weise optimiert werden.

Einige großartige Links:

Tutorials für die Entwicklung von Eclipse Annotation-Prozessoren

Java-Entwicklungstools - Tools zur Bearbeitung von Annotations

    
Narendra Pathai 30.11.2012 12:40
quelle
7

Ich denke, Sie könnten eine Schnittstelle erstellen, die diese Methode definiert. Auf diese Weise überschreibt Ihre Klasse die Methode und es sollte keine Warnung angezeigt werden.

VonXML.java:

%Vor%

MeinInterface.java:

%Vor%

MyClass.java

%Vor%

BEARBEITEN: Eine andere Lösung könnte darin bestehen, Ihre Methode als abstrakt zu definieren. In der Tat, wie ich Ihren Code verstehe, sind Ihre Methoden nur Deklaration (Implementierungen sind in einer XML-Datei). Also, Ihr Problem ist mehr ein Design-Problem als ein IDE-Problem (Ihre IDE ist genau richtig mit der Warnung). Die Realität ist, dass Ihre Methode abstrakt ist und woanders definiert ist.

Wenn Sie also Ihre Methode als abstrakt definieren, wird das Problem gelöst, aber Sie müssen die Klasse abstrakt machen:

%Vor%

Ich weiß, dass Sie sagen werden, dass diese Lösung es unmöglich macht, Objekte leicht zu erstellen, aber Sie haben dann zwei Lösungen:

1 - Erstellen Sie Ihre Objekte inline:

%Vor%

2 - Erstellen Sie eine Factory-Methode in Ihrem Abstract MyClassUsingOnSomethingClick :

%Vor%

Auch wenn ich verstehe, dass Sie eine schnellere Lösung bevorzugen würden, glaube ich, dass diese Lösung am saubersten ist, weil:

  1. Es respektiert die Philosophie der objektorientierten Programmierung.
  2. Es ist nicht spezifisch für eine IDE.
  3. Es vermeidet das Annotation Processing Tool (welches meiner Meinung nach sehr weise verwendet werden sollte)
ncenerar 30.11.2012 10:36
quelle
Django: Verwenden von Annotate, Count und Distinct in einem Queryset ___ tag123recursion ___ Rekursion ist eine Art Funktionsaufruf, bei dem sich eine Funktion selbst aufruft. Solche Funktionen werden auch rekursive Funktionen genannt. Strukturelle Rekursion ist eine Methode zur Problemlösung, bei der die Lösung eines Problems von Lösungen für kleinere Instanzen des gleichen Problems abhängt. ___ tag123scheme ___ Scheme ist eine funktionale Programmiersprache in der Lisp-Familie, die dem Lambda-Kalkül sehr ähnlich ist, mit eifriger (applicative-order) -Auswertung. Bei Fragen zu URL-Schemas verwenden Sie bitte das Tag "url-scheme". ___ answer13664715 ___

Damit eine Funktion tail-rekursiv ist, muss nach der Rückgabe der Funktion nichts weiter zu tun sein, als ihren Wert zurückzugeben. Das heißt, das letzte, was im rekursiven Schritt passiert, ist der Aufruf der Funktion selbst. Dies wird im Allgemeinen durch Verwendung eines Akkumulatorparameters erreicht, um die Antwort zu verfolgen:

%Vor%

Die obige Prozedur wird zunächst mit %code% als Akkumulator wie folgt aufgerufen:

%Vor%

Beachten Sie, dass der akkumulierte Wert zurückgegeben wird, wenn der Basisfall erreicht wird, und dass der Parameter %code% an jedem Punkt des rekursiven Aufrufs aktualisiert wird. Ich musste der Prozedur einen zusätzlichen Parameter hinzufügen, aber dies kann vermieden werden, indem man eine innere Prozedur oder eine benannte %code% definiert, zum Beispiel:

%Vor%     
___ tag123tailrecursion ___ Die Tail-Rekursion ist eine rekursive Strategie, bei der eine Funktion eine gewisse Menge an Arbeit ausführt und sich dann selbst aufruft. Der "Schwanz" bezieht sich auf die Tatsache, dass die Rekursion am Ende der Funktion ist. Viele - insbesondere funktionale - Programmiersprachen-Compiler können diese Arten von Aufrufen in Iteration umwandeln, was bedeutet, dass die Tail-Rekursion in unterstützten Sprachen ohne Angst vor einem Stack-Überlauf verwendet werden kann, unabhängig von der Anzahl der Aufrufe. ___ qstntxt ___

Ich lerne für einen Weihnachtstest und mache ein paar Prüfungsfragen, ich bin auf dieses Problem gestoßen, das mich ein wenig ratlos macht.

Ich kann reguläre Rekursion gut machen, aber ich kann nicht meinen Kopf darum drehen, wie ich dasselbe mit der Schwanzrekursion schreiben kann.

Reguläre Version:

%Vor%     
___