Ich habe ein wenig Java-Code (mit der Klasse Guava ImmutableList
):
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?
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.
Tags und Links java type-safety variadic-functions