Ist @SafeVarargs eine geeignete Anmerkung für diese Methode?

8

Ich habe ein wenig Java-Code (mit der Klasse Guava ImmutableList ):

%Vor%

Ich erhalte die üblichen Warnhinweise zur Haufenverschmutzung, die mit einer solchen Methode kommen. Da meine Methode keine Änderungen an events vornimmt, kann keine Heap-Verschmutzung eingeführt werden. Wenn jedoch (wegen der Löschung) ein Client dieser Methode ihn mit einem schlechten events -Array aufruft, scheint es, dass er eine Häufung durch sich selbst verbreiten kann.

Wenn ich es mit @SafeVarargs annotiere, bekomme ich immer noch eine Warnung (unterdrückbar mit @SuppressWarnings("varargs") ). Aber die Java-Dokumentation zu Haufenverschmutzung zu lesen, ist mir ein wenig unklar der richtige Satz von Anmerkungen zu dieser Methode.

Ich stelle auch fest, dass ImmutableList.copyOf nicht als @SafeVarargs markiert ist (obwohl dies möglicherweise nur ein Kompatibilitätsproblem ist), aber Arrays.asList ist.

Also, meine Frage: ist @SafeVarargs eine angemessene Annotation für diese Methode, da sie nicht auf ein ClassCastException trifft, aber ein unsachgemäß überprüftes Array bis zum endgültigen parametrisierten Typ weitergibt und ein ClastCastException erlaubt im Kundencode?

Ich glaube, basierend auf dieser Antwort , dass es sicher ist, da der Code nichts davon abhängig macht der Typ von events selbst, nur für den Typ seiner Elemente. Ist das eine korrekte Anwendung der Anleitung?

    
Michael Ekstrand 08.05.2015, 18:11
quelle

1 Antwort

9

Ja, @SafeVarargs sollte angemessen sein, weil das einzige, was mit events gemacht wird, ist, es an ImmutableList.copyOf() zu übergeben, was (in meinem Verständnis der Methode) nicht vom Laufzeittyp abhängt Array.

ImmutableList.copyOf() sollte mit @SafeVarargs kommentiert werden, aber es ist nicht (vielleicht für die Rückwärtskompatibilität oder sie haben es nicht bemerkt). Wenn Ihre nicht verifizierbare Methode varargs den varargs-Parameter an eine andere Methode übergibt, die möglicherweise vom Laufzeittyp des Arrays abhängt, dann (aus Gründen, die ich nicht vollständig verstehe, aber Gegenstand von diese Frage ) es gibt Ihnen eine varargs Warnung für diesen Anruf . Dies kann mit @SuppressWarnings("varargs") unterdrückt werden.

    
newacct 11.05.2015, 22:52
quelle