{"id":4738,"date":"2026-04-18T11:13:50","date_gmt":"2026-04-18T09:13:50","guid":{"rendered":"https:\/\/www.tutego.de\/blog\/javainsel\/?p=4738"},"modified":"2026-04-18T11:13:50","modified_gmt":"2026-04-18T09:13:50","slug":"buchupdate-jspecify-null-annotationen-in-spring","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2026\/04\/buchupdate-jspecify-null-annotationen-in-spring\/","title":{"rendered":"Buchupdate: JSpecify-Null-Annotationen in Spring"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p class=\"MsoNormal\"><span lang=\"DE\">Ausnahmen vom Typ <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">NullPointerException<\/span><\/span><\/span><span lang=\"DE\"> bleiben bis heute ein l\u00e4stiges Problem. Gl\u00fccklicherweise k\u00f6nnen statische Analysewerkzeuge und moderne IDEs heute zuverl\u00e4ssig pr\u00fcfen, ob ein Ausdruck dereferenziert wird, der m\u00f6glicherweise <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">null<\/span><\/span><\/span><span lang=\"DE\"> ist. Problematisch bleiben dabei vor allem Bibliotheken, deren Null-Verhalten nicht pr\u00e4zise beschrieben ist. Aus diesem Grund haben sich Null-Annotationen etabliert, mit denen sich ausdr\u00fccken l\u00e4sst, ob ein Typ <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">null<\/span><\/span><\/span><span lang=\"DE\"> sein darf oder nicht.<\/span><\/p>\n<h3 style=\"mso-list: l1 level3 lfo2;\"><span lang=\"DE\" style=\"mso-fareast-font-family: Arial; mso-bidi-font-family: Arial;\"><span style=\"mso-list: Ignore;\"><span style=\"font: 7.0pt 'Times New Roman';\">\u00a0<\/span><\/span><\/span><!--[endif]--><span lang=\"DE\">JSpecify<\/span><\/h3>\n<p class=\"MsoNormal\"><span lang=\"DE\">Ab Spring Framework 7 setzt Spring f\u00fcr Null-Safety auf <span class=\"Begriff\">JSpecify<\/span><\/span><!-- [if supportFields]><span\nlang=DE><span style='mso-element:field-begin'><\/span> XE &quot;JSpecify&quot; <\/span><![endif]--><!-- [if supportFields]><span\nlang=DE><span style='mso-element:field-end'><\/span><\/span><![endif]--><span lang=\"DE\"><span style=\"mso-spacerun: yes;\">\u00a0<\/span>(<span class=\"URL\">https:\/\/jspecify.dev\/<\/span>). JSpecify ist ein gemeinsames Standardisierungsprojekt, das unter anderem von Google, JetBrains (IntelliJ) und dem Spring-Team vorangetrieben wird. Ziel ist eine einheitliche, werkzeug\u00fcbergreifende Semantik f\u00fcr Null-Sicherheit in Java, im Gegensatz zu \u00e4lteren Ans\u00e4tzen wie JSR-305, die nie konsistent umgesetzt wurden.<\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"mso-ansi-language: EN-US;\">JSpecify deklariert im Paket <\/span><span class=\"ListingZeichen\"><span style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none; mso-ansi-language: EN-US;\"><span style=\"border: none;\">org.jspecify.annotations<\/span><\/span><\/span><span style=\"mso-ansi-language: EN-US;\"> folgende Annotationstypen:<\/span><\/p>\n<p class=\"Listeunnummeriert\" style=\"mso-list: l0 level1 lfo1;\"><!-- [if !supportLists]--><span lang=\"DE\" style=\"font-size: 8.0pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-fareast-language: EN-US;\"><span style=\"mso-list: Ignore;\">\u00a7<span style=\"font: 7.0pt 'Times New Roman';\">\u00a0\u00a0 <\/span><\/span><\/span><!--[endif]--><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NullMarked<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">: Definiert einen Geltungsbereich (Paket, Klasse, Methode, Modul), in dem alle nicht annotierten Typverwendungen standardm\u00e4\u00dfig als nicht-<\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">null<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\"> gelten.<\/span><\/p>\n<p class=\"Listeunnummeriert\" style=\"mso-list: l0 level1 lfo1;\"><!-- [if !supportLists]--><span lang=\"DE\" style=\"font-size: 8.0pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-fareast-language: EN-US;\"><span style=\"mso-list: Ignore;\">\u00a7<span style=\"font: 7.0pt 'Times New Roman';\">\u00a0\u00a0 <\/span><\/span><\/span><!--[endif]--><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@Nullable<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">: Markiert eine Typverwendung explizit als <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">null<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\"> zul\u00e4ssig, also als Wert, der <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">null<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\"> sein darf. Wird verwendet, um Ausnahmen innerhalb eines <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NullMark<span style=\"border: none;\">ed<\/span><\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">-Kontexts zu kennzeichnen.<\/span><\/p>\n<p class=\"Listeunnummeriert\" style=\"mso-list: l0 level1 lfo1;\"><!-- [if !supportLists]--><span lang=\"DE\" style=\"font-size: 8.0pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-fareast-language: EN-US;\"><span style=\"mso-list: Ignore;\">\u00a7<span style=\"font: 7.0pt 'Times New Roman';\">\u00a0\u00a0 <\/span><\/span><\/span><!--[endif]--><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NonNull<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">: Markiert eine Typverwendung explizit als nicht-<\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">null<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">. Vor allem sinnvoll au\u00dferhalb eines <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NullMarked<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">-Kontexts oder zur bewussten Hervorhebung.<\/span><\/p>\n<p class=\"Listeunnummeriert\" style=\"mso-list: l0 level1 lfo1; mso-prop-change: 'info\\@tutego\\.de' 20260418T1029;\"><!-- [if !supportLists]--><span lang=\"DE\" style=\"font-size: 8.0pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-fareast-language: EN-US;\"><span style=\"mso-list: Ignore;\">\u00a7<span style=\"font: 7.0pt 'Times New Roman';\">\u00a0\u00a0 <\/span><\/span><\/span><!--[endif]--><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NullUnmarked<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">: Hebt die Wirkung von <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NullMarked<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\"> innerhalb eines Bereichs auf. Nicht annotierte Typverwendungen haben dort wieder keine definierte Null-Semantik. Wird prim\u00e4r f\u00fcr Migration bestehender Codebasen genutzt.<\/span><\/p>\n<p class=\"Listeunnummeriert\" style=\"mso-list: l0 level1 lfo1;\">\n<p class=\"Kastenberschrift\"><span lang=\"DE\" style=\"color: black; mso-color-alt: windowtext;\">Hinweis<\/span><\/p>\n<p class=\"KastenStandard\"><span lang=\"DE\" style=\"color: black; mso-color-alt: windowtext;\">Die Annotationen stammen aus dem Artefakt <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 11.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">org.jspecify:jspecify<\/span><\/span><\/span><span lang=\"DE\" style=\"color: black; mso-color-alt: windowtext;\">. In Spring Framework 7 ist diese Abh\u00e4ngigkeit in <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 11.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">spring-core<\/span><\/span><\/span><span lang=\"DE\" style=\"color: black; mso-color-alt: windowtext;\"> als API-Abh\u00e4ngigkeit enthalten und in typischen Projekten transitiv verf\u00fcgbar. Kotlin ab Version 2.1 wertet Annotationen aus <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 11.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">org.jspecify.annotations<\/span><\/span><\/span><span lang=\"DE\" style=\"color: black; mso-color-alt: windowtext;\"> strikt aus.<\/span><\/p>\n<h4><span lang=\"DE\">Pr\u00fcfung durch Tools<\/span><\/h4>\n<p class=\"MsoNormal\"><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">Entwicklungsumgebungen wie IntelliJ IDEA sowie statische Analysewerkzeuge k\u00f6nnen JSpecify-Annotationen auswerten und auf potenzielle <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">NullPointerException<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">-Risiken hinweisen. Spring Framework verwendet ab Version 7 im Build-Prozess zus\u00e4tzlich das Analysewerkzeug <\/span><span class=\"Begriff\"><span lang=\"DE\">NullAway<\/span><\/span><!-- [if supportFields]><span\nclass=Begriff><span lang=DE><span style='mso-element:field-begin'><\/span><\/span><\/span><span\nlang=DE> XE &quot;NullAway&quot; <\/span><![endif]--><!-- [if supportFields]><span\nclass=Begriff><span lang=DE><span style='mso-element:field-end'><\/span><\/span><\/span><![endif]--><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\"><span style=\"mso-spacerun: yes;\">\u00a0<\/span>(<\/span><span class=\"URL\"><span lang=\"DE\">https:\/\/github.com\/uber\/nullaway<\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">). NullAway ist ein Compile-Time-Checker auf Basis von <\/span><span class=\"Begriff\"><span lang=\"DE\">Google Error Prone<\/span><\/span><!-- [if supportFields]><span class=Begriff><span\nlang=DE><span style='mso-element:field-begin'><\/span><\/span><\/span><span\nlang=DE> XE &quot;Error Prone&quot; <\/span><![endif]--><!-- [if supportFields]><span\nclass=Begriff><span lang=DE><span style='mso-element:field-end'><\/span><\/span><\/span><![endif]--><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\"><span style=\"mso-spacerun: yes;\">\u00a0<\/span>(<\/span><span class=\"URL\"><span lang=\"DE\">https:\/\/github.com\/google\/error-prone<\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">), der die Einhaltung von Null-Vertr\u00e4gen strikt \u00fcberpr\u00fcft. Verst\u00f6\u00dfe \u2013 etwa das Zur\u00fcckgeben von <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">null<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\"> trotz nicht-null Annotation oder die \u00dcbergabe von <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">null<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\"> an nicht-<\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">null<\/span><\/span><\/span><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\"> Parameter \u2013 f\u00fchren dabei zu Build-Fehlern.<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">Auf diese Weise stellt Spring sicher, dass die eigene API konsistent annotiert ist und keine versteckten Null-Probleme enth\u00e4lt.<\/span><\/p>\n<h4><span lang=\"DE\">Null-Pr\u00fcfungen in eigenen Projekten<\/span><\/h4>\n<p class=\"MsoNormal\"><span lang=\"DE\" style=\"mso-fareast-language: EN-US;\">Dieselbe Art der Pr\u00fcfung l\u00e4sst sich auch in eigenen Projekten integrieren, um Null-Fehler fr\u00fchzeitig und reproduzierbar im Build zu erkennen.<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"DE\">Um <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NullMarked<\/span><\/span><\/span><span lang=\"DE\"> auf Paketebene zu aktivieren, legt man eine <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">package-info.java<\/span><\/span><\/span><span lang=\"DE\"> an:<\/span><\/p>\n<p class=\"ListingJavaCxSpFirst\"><span style=\"mso-ansi-language: EN-US;\">@NullMarked<\/span><\/p>\n<p class=\"ListingJavaCxSpMiddle\"><span style=\"mso-ansi-language: EN-US;\">package com.tutego.date4u.core;<\/span><\/p>\n<p class=\"ListingJavaCxSpMiddle\"><span style=\"mso-ansi-language: EN-US;\">\u00a0<\/span><\/p>\n<p class=\"ListingJavaCxSpLast\"><span style=\"mso-ansi-language: EN-US;\">import org.jspecify.annotations.NullMarked;<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"DE\">Damit werden in diesem Paket nicht annotierte Typverwendungen standardm\u00e4\u00dfig als nicht-null interpretiert, sofern nicht explizit <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@Nullable<\/span><\/span><\/span><span lang=\"DE\"> verwendet wird.<\/span><\/p>\n<h4><span lang=\"DE\">Fr\u00fchere Spring-Annotationen<\/span><\/h4>\n<p class=\"MsoNormal\"><span lang=\"DE\">Spring stellte \u00fcber viele Jahre eigene Null-Annotationen im Paket <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">org.springframework.lang<\/span><\/span><\/span><a style=\"mso-footnote-id: ftn1;\" title=\"\" href=\"#_ftn1\" name=\"_ftnref1\"><span class=\"MsoFootnoteReference\"><span lang=\"DE\"><span style=\"mso-special-character: footnote;\"><!-- [if !supportFootnotes]--><span class=\"MsoFootnoteReference\"><span lang=\"DE\" style=\"font-size: 11.0pt; mso-bidi-font-size: 10.0pt; font-family: 'Times New Roman',serif; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: DE; mso-fareast-language: DE; mso-bidi-language: AR-SA;\">[1]<\/span><\/span><!--[endif]--><\/span><\/span><\/span><\/a><span lang=\"DE\"> bereit. Diese sind seit Spring Framework 7 jedoch veraltet und werden durch JSpecify ersetzt. Die fr\u00fchere Semantik l\u00e4sst sich grob wie folgt abbilden:<\/span><\/p>\n<p class=\"Listeunnummeriert\" style=\"mso-list: l0 level1 lfo1;\"><!-- [if !supportLists]--><span lang=\"DE\" style=\"font-size: 8.0pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black;\"><span style=\"mso-list: Ignore;\">\u00a7<span style=\"font: 7.0pt 'Times New Roman';\">\u00a0\u00a0 <\/span><\/span><\/span><!--[endif]--><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NonNullApi<\/span><\/span><\/span><span lang=\"DE\"> entspricht funktional einem <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NullMarked<\/span><\/span><\/span><span lang=\"DE\"> auf Paketebene<\/span><\/p>\n<p class=\"Listeunnummeriert\" style=\"mso-list: l0 level1 lfo1;\"><!-- [if !supportLists]--><span lang=\"DE\" style=\"font-size: 8.0pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black;\"><span style=\"mso-list: Ignore;\">\u00a7<span style=\"font: 7.0pt 'Times New Roman';\">\u00a0\u00a0 <\/span><\/span><\/span><!--[endif]--><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NonNullFields<\/span><\/span><\/span><span lang=\"DE\"> wird ebenfalls durch <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NullMarked<\/span><\/span><\/span><span lang=\"DE\"> abgedeckt<\/span><\/p>\n<p class=\"Listeunnummeriert\" style=\"mso-list: l0 level1 lfo1;\"><!-- [if !supportLists]--><span lang=\"DE\" style=\"font-size: 8.0pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black;\"><span style=\"mso-list: Ignore;\">\u00a7<span style=\"font: 7.0pt 'Times New Roman';\">\u00a0\u00a0 <\/span><\/span><\/span><!--[endif]--><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@Nullable<\/span><\/span><\/span><span lang=\"DE\"> bleibt in gleicher Bedeutung erhalten<\/span><\/p>\n<p class=\"Listeunnummeriert\" style=\"mso-list: l0 level1 lfo1;\"><!-- [if !supportLists]--><span lang=\"DE\" style=\"font-size: 8.0pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black;\"><span style=\"mso-list: Ignore;\">\u00a7<span style=\"font: 7.0pt 'Times New Roman';\">\u00a0\u00a0 <\/span><\/span><\/span><!--[endif]--><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NonNull<\/span><\/span><\/span><span lang=\"DE\"> kann weiterhin zur expliziten Kennzeichnung verwendet werden<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"DE\">Dabei handelt es sich jedoch nicht um eine rein mechanische Ersetzung. W\u00e4hrend die Spring-Annotationen pauschal auf Parameter, R\u00fcckgabewerte und Felder wirkten, basiert JSpecify auf einer pr\u00e4ziseren Typsemantik: Annotationen beziehen sich auf konkrete Typverwendungen. Dadurch lassen sich insbesondere generische Typen sowie Array- und Vararg-Elemente pr\u00e4ziser beschreiben.<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"DE\">\u00a0<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"DE\">F\u00fcr bestehende Codebasen kann <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NullUnmarked<\/span><\/span><\/span><span lang=\"DE\"> verwendet werden, um noch nicht migrierte Bereiche vor\u00fcbergehend vom <\/span><span class=\"ListingZeichen\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; border: none;\"><span style=\"border: none;\">@NullMarked<\/span><\/span><\/span><span lang=\"DE\">-Defaulting auszunehmen und die Migration schrittweise durchzuf\u00fchren.<\/span><\/p>\n<div style=\"mso-element: footnote-list;\"><!-- [if !supportFootnotes]--><br clear=\"all\" \/><\/p>\n<hr align=\"left\" size=\"1\" width=\"33%\" \/>\n<p><!--[endif]--><\/p>\n<div id=\"ftn1\" style=\"mso-element: footnote;\">\n<p class=\"MsoFootnoteText\"><a style=\"mso-footnote-id: ftn1;\" title=\"\" href=\"#_ftnref1\" name=\"_ftn1\"><span class=\"MsoFootnoteReference\"><span lang=\"DE\"><span style=\"mso-special-character: footnote;\"><!-- [if !supportFootnotes]--><span class=\"MsoFootnoteReference\"><span lang=\"DE\" style=\"font-size: 9.0pt; mso-bidi-font-size: 10.0pt; font-family: 'Times New Roman',serif; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: DE; mso-fareast-language: DE; mso-bidi-language: AR-SA;\">[1]<\/span><\/span><!--[endif]--><\/span><\/span><\/span><\/a><span lang=\"DE\"> <span class=\"URL\">https:\/\/docs.spring.io\/spring-framework\/docs\/current\/javadoc-api\/org\/springframework\/lang\/package-summary.html<\/span><\/span><\/p>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Ausnahmen vom Typ NullPointerException bleiben bis heute ein l\u00e4stiges Problem. Gl\u00fccklicherweise k\u00f6nnen statische Analysewerkzeuge und moderne IDEs heute zuverl\u00e4ssig pr\u00fcfen, ob ein Ausdruck dereferenziert wird, der m\u00f6glicherweise null ist. Problematisch bleiben dabei vor allem Bibliotheken, deren Null-Verhalten nicht pr\u00e4zise beschrieben ist. Aus diesem Grund haben sich Null-Annotationen etabliert, mit denen sich ausdr\u00fccken l\u00e4sst, ob [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[3],"tags":[],"class_list":["post-4738","post","type-post","status-publish","format-standard","hentry","category-spring"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4738","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=4738"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4738\/revisions"}],"predecessor-version":[{"id":4739,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4738\/revisions\/4739"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4738"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4738"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4738"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}