Většinou bych dával spíše přednost rozhraním a kompozici před abstraktními třídami a dědičností. Při kompozici mohu vložit více různých komponent, při dědičnosti mám jasně danou hierarchii.
Nicméně má to i své stinné stránky z hlediska náročnosti na RAM a výkon:
1. Hierarchie tříd nemá žádné další paměťové náklady na každou instanci, oproti tomu kompozice znamená další reference, i pokud tu odkazovanou komponentu používáte opakovaně. (Pokud ji vytváříte pokaždé znovu, je to ještě horší…) U tříd, ke kterým máte pár instancí, asi vyhraje použitelnost kódu, ale třeba u kolekcí je IMHO celkem odůvodněné dát přednost dědičnosti.
2. Volání metody třídy může být levnější než volání metody rozhraní, protože je jednodušší prohledat VMT pro jednoduchou dědičnost než VMT pro vícenásobnou dědičnost. Nicméně hádám, že toto obvykle fakt nemusíte řešit, mj. proto, že JVM spoustu věcí zvládne optimalizovat. (BTW, udělat na to benchmark by mohla být zábava – zejména poprat se s optimalizátorem tak, aby do toho neházel vidle…)