{"id":1361,"date":"2012-06-06T15:24:32","date_gmt":"2012-06-06T13:24:32","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1361"},"modified":"2012-06-06T21:27:35","modified_gmt":"2012-06-06T19:27:35","slug":"echte-typsichere-container","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2012\/06\/echte-typsichere-container\/","title":{"rendered":"Echte typsichere Container"},"content":{"rendered":"<p>Verwenden Entwickler die Sammlungen untypisiert, also mit dem Raw-Typ, so l\u00e4sst sich nicht verhindern, dass ein ungew\u00fcnschter Typ die Sammlung betritt und beim Entnehmen zu einer Ausnahme f\u00fchren kann. Der Grund liegt in der internen Umsetzung, dass nur der Compiler selbst die Typsicherheit sicherstellt, aber nicht die Laufzeitumgebung. Um die Typsicherheit zu erh\u00f6hen, bietet die Collections-Klasse ein paar Wrapper-Methoden, die eine Sammlung nehmen und Operationen nur eines gewissen Typs durchlassen \u2013 versto\u00dft ein Aufrufer dagegen, gibt es eine ClassCastException.<\/p>\n<p>class java.util.Collections<\/p>\n<p>\u00a7 static &lt;E&gt; Collection&lt;E&gt; checkedCollection(Collection&lt;E&gt; c, Class&lt;E&gt; type)<\/p>\n<p>\u00a7 static &lt;E&gt; List&lt;E&gt; checkedList(List&lt;E&gt; list, Class&lt;E&gt; type)<\/p>\n<p>\u00a7 static &lt;K,V&gt; Map&lt;K,V&gt; checkedMap(Map&lt;K,V&gt; m, Class&lt;K&gt; keyType, Class&lt;V&gt; valueType)<\/p>\n<p>\u00a7 static &lt;E&gt; Queue&lt;E&gt; checkedQueue(Queue&lt;E&gt; queue, Class&lt;E&gt; type)<\/p>\n<p>\u00a7 static &lt;E&gt; Set&lt;E&gt; checkedSet(Set&lt;E&gt; s, Class&lt;E&gt; type)<\/p>\n<p>\u00a7 static &lt;K,V&gt; SortedMap&lt;K,V&gt; checkedSortedMap(SortedMap&lt;K,V&gt; m, Class&lt;K&gt; keyType, Class&lt;V&gt; valueType)<\/p>\n<p>\u00a7 static &lt;E&gt; SortedSet&lt;E&gt; checkedSortedSet(SortedSet&lt;E&gt; s, Class&lt;E&gt; type)<\/p>\n<p>Beispiel: Lasse in eine Menge nur Strings, aber nichts anderes.<\/p>\n<p>Set&lt;String&gt; set = Collections.checkedSet( new HashSet&lt;String&gt;(),<\/p>\n<p>String.class );<\/p>\n<p>set.add( &quot;xyz&quot; ); \/\/ Compiler OK<\/p>\n<p>Set rawset = set;<\/p>\n<p>rawset.add( &quot;abc&quot; ); \/\/ Compiler OK<\/p>\n<p>rawset.add( new Object() ); \/\/ Compiler OK,&#160; N Laufzeitfehler<\/p>\n<p>Die Ausnahme ist: \u201cException in thread &quot;main&quot; java.lang.ClassCastException: Attempt to insert class java.lang.Object element into collection with element type class java.lang.String\u201d<\/p>\n<p>Auch wenn kein Programmierer freiwillig falsche Typen in eine Sammlung platziert, ist es doch besser, eine absolute Sicherheit zu bekommen, die nicht auf dem Compiler beruht. Wenn etwa ein Programm einer Skriptsprache die M\u00f6glichkeit er\u00f6ffnet Elemente in eine Datenstruktur zu setzen, so l\u00e4sst sich f\u00fcr die Skriptsprache eine gepr\u00fcfte Sammlung zur Ablage nach au\u00dfen geben. Achtet das Skript nicht auf den richtigen Typ, so knallt es im Skript. Das ist gew\u00fcnscht, denn andernfalls w\u00fcrde viel sp\u00e4ter erst der falsche Typ bei der Bearbeitung auffallen und dann knallt es an der ganz falschen Stelle.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Verwenden Entwickler die Sammlungen untypisiert, also mit dem Raw-Typ, so l\u00e4sst sich nicht verhindern, dass ein ungew\u00fcnschter Typ die Sammlung betritt und beim Entnehmen zu einer Ausnahme f\u00fchren kann. Der Grund liegt in der internen Umsetzung, dass nur der Compiler selbst die Typsicherheit sicherstellt, aber nicht die Laufzeitumgebung. Um die Typsicherheit zu erh\u00f6hen, bietet die [&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":[11],"tags":[],"class_list":["post-1361","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1361","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=1361"}],"version-history":[{"count":2,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1361\/revisions"}],"predecessor-version":[{"id":1366,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1361\/revisions\/1366"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}