Was meint der mit Destructuring

14/01/2014 - 13:00 von Heiner Kücker | Report spam
Hallo,

ich habe diesen Artikel gelesen:

http://java.dzone.com/articles/bad-...inking-too

Darin schreibt der Autor Jakub Holý,
dass Destructuring in Clojure eine viel bessere Lösung als benannte Argumente sei.

http://blog.jayfields.com/2010/07/c...uring.html

Leider habe ich nicht verstanden, was der Autor damit meint, es kann auch an meinen geringen Englisch-Kenntnissen liegen.

Kann mir das jemand genauer erlàutern?

Danke
Heiner
 

Lesen sie die antworten

#1 Florian Weimer
14/01/2014 - 13:35 | Warnen spam
* Heiner Kücker:

Leider habe ich nicht verstanden, was der Autor damit meint, es kann
auch an meinen geringen Englisch-Kenntnissen liegen.



Die Terminologie kommt von DESTRUCTURING-BIND aus Common Lisp:
<http://clhs.lisp.se/Body/m_destru.htm>

In anderen Sprachen (SML, Haskell) làuft das unter "Pattern Matching".

Kann mir das jemand genauer erlàutern?



In Java ist das ein bißchen schwierig. Es gibt in echtem Java
Array-Literale, z.B.

String var1, var2;
...
String[] array = {"prefix", var1, var2, "suffix"};

Mit "destructing" kann man das schreiben:

String prefix, v1, v2, suffix;
{prefix, v1, v2, suffix} = array;

und es ist grob àquivalent zu:

String prefix, v1, v2, suffix;
if (array.length != 4) throw new ArrayIndexOutOfBoundsException();
prefix = array[0];
v1 = array[1];
v2 = array[2];
suffix = array[3];

Viel interessanter ist es, wenn Java auch Record-Literale hàtte, also
z.B.

Map.Entry<String, String> e = {key: "key-string", value: var1};

Dann wàre "destructuring" das hier:

String k, v;
{key: k, value: v} = e;

und àquivalent zu:

String k, v;
k = e.getKey();
v = e.getValue();

SML erlaubt auch noch eine Verkürzung, zu:

String key, String value;
{key, value} = e;

also:

String key, String value;
key = e.getKey();
value = e.getValue();

Ohne (lokale) Typinferenz ist das allerdings etwas mühsam, weil man
immer die Zeilen mit den Typen angeben muß. In Sprachen wie SML kann
man das weglassen, weil der Compiler bei Bedarf die ermittelten Typen
also die vom Programmierer gewünschten annimmt.

(Mein Beispiel mit Map.Entry ist so nicht mehr in Java integrierbar,
weil es sich nicht mit "default methods" in Java 8 vertràgt.)

Ähnliche fragen