Java-kod kräver ibland mer kod-duplicering än Scala, p.g.a. att multipelt arv saknas, medan Scala har traits

Det finns ett koncept som kallas Mixin och som Scala implementerar med s.k. traits. Visserligen finns det vissa skillnader mellan traits och multipelt arv, som du kan läsa mer om i Kapitel 12.6 "Why not multiple inheritance" i boken Programming in Scala, men lite förenklat kan man ändå jämföra traits med interface som kan innehålla implementation och vars implementation kan mixas in till olika klasser som ärver från olika andra basklasser.

Med Java kan man visserligen återanvända kod genom "Object composition", som f.ö. rekommenderas generellt i stället för att ärva klasser i GoF-boken om Design patterns, dvs då man implementerar ett interface så kan man delegera vidare implementationen till ett annat objekt som innehåller den återanvändbara implementationen. Icke desto mindre så måste alla implementationerna duplicera metodsignaturerna i interfacet samt skicka vidare anropet till ett annat objekt, som förstås också måste instansieras.

Ett exempel är om man vill använda sig av Java-klassen Observable, men inte kan (eller inte vill) ärva från den, t.ex. p.g.a. att det enda arvet är förbrukat. Exempelvis skulle man kunna ha en Person-klass och en Produkt-klass som båda skall kunna observeras, men dessa båda klasser måste ärva andra klasser utan att kunna ha en gemensam Observable som basklass. Då kan man självklart själv implementera en metod 'addObserver' (dvs i stället för att ärva den från Observable) i de båda klasserna, och låta dem delegera vidare anropet till en instans av Observable som aggregeras av de båda klasserna, men resultatet blir inte fritt från duplicering, vilket bör framgå av exemplet som länkas nedan.

På websidan som länkas nedan finns källkod (och kommentarer på engelska) för ett sådant exempel, inklusive ett exempel på hur man skulle kunna implementera med Scala traits för att undvika den dupliceringen som uppstår med en Java-implementation. Där visas slutligen även lite test-kod som använder ramverket Mockito för att verifiera att Observer-metoderna blir anropade, både för Java- och Scala-implementationerna av Java-interfacen Person och Product.
Scala can mix in reusable code into different classes while Java can only inherit from one base class

/ Tomas Johansson, 2010-01-19