{"id":1670,"date":"2013-01-09T03:25:35","date_gmt":"2013-01-09T01:25:35","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1670"},"modified":"2013-01-09T03:25:35","modified_gmt":"2013-01-09T01:25:35","slug":"java-8-und-jsr-308-was-ist-stand-der-dinge","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/01\/java-8-und-jsr-308-was-ist-stand-der-dinge\/","title":{"rendered":"Java 8 und JSR-308, was ist Stand der Dinge?"},"content":{"rendered":"<p>Die Idee bei JSR-308: Annotationen an allem m\u00f6glichen Typen dranmachen (daher auch der Name \u201cType Annotations\u201d). Z.B. so:<\/p>\n<p>Map&lt;@NonNull String, @NonEmpty List&lt;@Readonly Document&gt;&gt; files; <\/p>\n<p>Mehr auch unter <a title=\"http:\/\/jcp.org\/aboutJava\/communityprocess\/ec-public\/materials\/2012-01-1011\/jsr308-201201.pdf\" href=\"http:\/\/jcp.org\/aboutJava\/communityprocess\/ec-public\/materials\/2012-01-1011\/jsr308-201201.pdf\">http:\/\/jcp.org\/aboutJava\/communityprocess\/ec-public\/materials\/2012-01-1011\/jsr308-201201.pdf<\/a> oder in der Spec <a title=\"http:\/\/types.cs.washington.edu\/jsr308\/specification\/java-annotation-design.html\" href=\"http:\/\/types.cs.washington.edu\/jsr308\/specification\/java-annotation-design.html\">http:\/\/types.cs.washington.edu\/jsr308\/specification\/java-annotation-design.html<\/a>.<\/p>\n<p>Mit dem aktuellen JDK 8 k\u00f6nnen zwar Annotationen deklariert werden, die f\u00fcr neue \u201cOrte\u201d stehen (<a href=\"http:\/\/download.java.net\/jdk8\/docs\/api\/java\/lang\/annotation\/ElementType.html\">http:\/\/download.java.net\/jdk8\/docs\/api\/java\/lang\/annotation\/ElementType.html<\/a> hat seit 1.8 TYPE_PARAMETER und TYPE_USE), aber sonst ist mit Standardcompiler nicht viel los. Testet man oberes Beispiel, gibt es nur Fehler:<\/p>\n<p>@Target(value= ElementType.TYPE_USE)   <br \/>@interface NonNull { }<\/p>\n<p>@Target(value= ElementType.TYPE_USE)   <br \/>@interface NonEmpty { }<\/p>\n<p>@Target(value= ElementType.TYPE_USE)   <br \/>@interface Readonly { }<\/p>\n<p>class Document {}<\/p>\n<p>class Main {   <br \/>&#160;&#160;&#160; Map&lt;@NonNull String, @NonEmpty List&lt;@Readonly Document&gt;&gt; files;     <br \/>}<\/p>\n<p>Dann rappelt es nur:   <br \/>C:\\Users\\Christian\\Documents\\NetBeansProjects\\App\\src\\app\\Main.java:53: error: illegal start of type    <br \/>&#160;&#160;&#160; Map&lt;@NonNull String, @NonEmpty List&lt;@Readonly Document&gt;&gt; files;     <br \/>C:\\Users\\Christian\\Documents\\NetBeansProjects\\App\\src\\app\\Main.java:53: error: &#8218;;&#8216; expected    <br \/>&#160;&#160;&#160; Map&lt;@NonNull String, @NonEmpty List&lt;@Readonly Document&gt;&gt; files;     <br \/>C:\\Users\\Christian\\Documents\\NetBeansProjects\\App\\src\\app\\Main.java:53: error: &lt;identifier&gt; expected    <br \/>&#160;&#160;&#160; Map&lt;@NonNull String, @NonEmpty List&lt;@Readonly Document&gt;&gt; files;     <br \/>C:\\Users\\Christian\\Documents\\NetBeansProjects\\App\\src\\app\\Main.java:53: error: &lt;identifier&gt; expected    <br \/>&#160;&#160;&#160; Map&lt;@NonNull String, @NonEmpty List&lt;@Readonly Document&gt;&gt; files;     <br \/>C:\\Users\\Christian\\Documents\\NetBeansProjects\\App\\src\\app\\Main.java:53: error: &#8218;;&#8216; expected    <br \/>&#160;&#160;&#160; Map&lt;@NonNull String, @NonEmpty List&lt;@Readonly Document&gt;&gt; files;     <br \/>C:\\Users\\Christian\\Documents\\NetBeansProjects\\App\\src\\app\\Main.java:53: error: &lt;identifier&gt; expected    <br \/>&#160;&#160;&#160; Map&lt;@NonNull String, @NonEmpty List&lt;@Readonly Document&gt;&gt; files;     <br \/>C:\\Users\\Christian\\Documents\\NetBeansProjects\\App\\src\\app\\Main.java:53: error: &#8218;(&#8218; expected    <br \/>&#160;&#160;&#160; Map&lt;@NonNull String, @NonEmpty List&lt;@Readonly Document&gt;&gt; files;     <br \/>C:\\Users\\Christian\\Documents\\NetBeansProjects\\App\\src\\app\\Main.java:53: error: &lt;identifier&gt; expected    <br \/>&#160;&#160;&#160; Map&lt;@NonNull String, @NonEmpty List&lt;@Readonly Document&gt;&gt; files; <\/p>\n<p> Wenn man JSR-308 wirklich nutzen m\u00f6chte, greift man zur experimentelle Version <a href=\"http:\/\/openjdk.java.net\/projects\/type-annotations\/\">http:\/\/openjdk.java.net\/projects\/type-annotations\/<\/a>. Wenn Oracle hier alles f\u00fcr rund h\u00e4lt, wandert das in das normale OpenJDK 8 Projekt. Das ist wie mit Lambda und dem OpenJDK 8.<\/p>\n<p>Wenn man dann einen funktionierenden Compiler und eine Unterst\u00fctzung hat, die Annotationen auszulesen, kann ein Checker diverse Sachen testen. Interessant sind @NonNull-Dinger oder auch Test f\u00fcr Immutibility. Hier ist <a href=\"http:\/\/types.cs.washington.edu\/jsr308\/\">http:\/\/types.cs.washington.edu\/jsr308\/<\/a> interessant, ein Checker-Framework, das in den Compiler integriert wird.<\/p>\n<p>JSR-308 ist schon ewig im Gespr\u00e4ch, 2007 (!) hatte ich das schon im Blog: <a href=\"http:\/\/www.tutego.de\/blog\/javainsel\/2007\/05\/erste-implementierung-fur-jsr-308\/\">http:\/\/www.tutego.de\/blog\/javainsel\/2007\/05\/erste-implementierung-fur-jsr-308\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Idee bei JSR-308: Annotationen an allem m\u00f6glichen Typen dranmachen (daher auch der Name \u201cType Annotations\u201d). Z.B. so: Map&lt;@NonNull String, @NonEmpty List&lt;@Readonly Document&gt;&gt; files; Mehr auch unter http:\/\/jcp.org\/aboutJava\/communityprocess\/ec-public\/materials\/2012-01-1011\/jsr308-201201.pdf oder in der Spec http:\/\/types.cs.washington.edu\/jsr308\/specification\/java-annotation-design.html. Mit dem aktuellen JDK 8 k\u00f6nnen zwar Annotationen deklariert werden, die f\u00fcr neue \u201cOrte\u201d stehen (http:\/\/download.java.net\/jdk8\/docs\/api\/java\/lang\/annotation\/ElementType.html hat seit 1.8 TYPE_PARAMETER und TYPE_USE), [&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":[66],"tags":[],"class_list":["post-1670","post","type-post","status-publish","format-standard","hentry","category-java-8"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1670","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=1670"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1670\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}