Ich kann das sehen @Nullable
und @Nonnull
Anmerkungen könnten hilfreich sein, um NullPointerException
s zu verhindern, aber sie verbreiten sich nicht sehr weit.
- Die Effektivität dieser Anmerkungen nimmt nach einer Indirektionsebene vollständig ab. Wenn Sie also nur einige hinzufügen, breiten sie sich nicht sehr weit aus.
- Da diese Anmerkungen nicht gut durchgesetzt werden, besteht die Gefahr, dass ein mit gekennzeichneter Wert
@Nonnull
nicht null ist und folglich keine Nullprüfungen durchgeführt werden.
Der folgende Code verursacht einen Parameter mit markiert @Nonnull
werden , null
ohne irgendwelche Beschwerden zu erhöhen. Es wirft ein, NullPointerException
wenn es ausgeführt wird.
public class Clazz {
public static void main(String[] args){
Clazz clazz = new Clazz();
// this line raises a complaint with the IDE (IntelliJ 11)
clazz.directPathToA(null);
// this line does not
clazz.indirectPathToA(null);
}
public void indirectPathToA(Integer y){
directPathToA(y);
}
public void directPathToA(@Nonnull Integer x){
x.toString(); // do stuff to x
}
}
Gibt es eine Möglichkeit, diese Anmerkungen strenger durchzusetzen und / oder weiter zu verbreiten?
@Nonnull
beim Aufrufen einer @Nonnull
Methode mit einer nullbaren Variablen eine Umwandlung in zu erfordern . Natürlich ist das Casting mit einer Annotation in Java 7 nicht möglich, aber Java 8 bietet die Möglichkeit, Annotationen auf die Verwendung einer Variablen anzuwenden, einschließlich Casts. So kann dies in Java 8 implementiert werden.
(@NonNull Integer) y
syntaktisch möglich, aber ein Compiler darf keinen bestimmten Bytecode basierend auf der Annotation ausgeben. Für Laufzeit-Assertions sind winzige Hilfsmethoden ausreichend, wie in bugs.eclipse.org/442103 (z. B. directPathToA(assertNonNull(y))
) beschrieben - aber wohlgemerkt , dies hilft nur, schnell zu scheitern. Der einzig sichere Weg besteht darin, eine tatsächliche Nullprüfung durchzuführen (und hoffentlich eine alternative Implementierung im Zweig else).
@Nonnull
und @Nullable
Sie sprechen, da es mehrere ähnliche Anmerkungen gibt (siehe diese Frage ). Sprechen Sie über die Anmerkungen im Paket javax.annotation
?
@Nullable
oder@Nonnull
, aber wenn sie es wert sind, ist es sehr "wahrscheinlich, Debatte zu erbitten"