2017-05-29 5 views
0

Ich habe Klassen von Apache-Commons-3 erweitert, um meine eigenen Dienstprogrammfunktionen hinzuzufügen, die in ihnen nicht verfügbar sind. z.B .:Best Practices zum Erweitern von Dienstklassen in Java

public class CollectionUtils extends org.apache.commons.collections.CollectionUtils 
{ 
     /** 
    * Similar to collection.contains(member) except just doesn't throw NPE when set is null, simply returns false 
    * @param collection 
    * @param member 
    * @return 
    */ 
    public static <K> boolean contains(Collection<K> collection,K member) 
    { 
     return collection!=null && collection.contains(member); 
    } 
} 

Dies löste meinen Zweck meiner Funktionen mit & commons Funktionen durch gleiche Klasse CollectionUtils.

Aber Apache hat die Erweiterbarkeit in Version 4 entfernt, indem private Konstruktoren in die Dienstprogrammklassen eingeführt wurden. Es gibt auch eine Diskussion über die gleiche here.

Jetzt bricht mein Code, wenn ich auf Version 4 aktualisiere. Was sind die besten Praktiken, um Dienstprogrammklassen zu erweitern, um benutzerdefinierte/spezifische Hilfsmethoden hinzuzufügen?

Antwort

1

Obwohl ich eng als "meinungsbasiert" gewählt habe, wollte ich Ihnen etwas Input geben.

Wie bereits in Ihrer verknüpften Diskussion gesagt, ist die Erweiterung von Utility-Klassen in erster Linie eine schlechte Praxis. Die Änderung in der Version 4 zielt wahrscheinlich auf diese Konvention ab.

Das Erweitern von Utility-Klassen (nur mit statischen Methoden) macht keinen Sinn, da statische Methoden sowieso nicht überschrieben werden können. Sie können sie jedoch ausblenden. Dies bedeutet, dass dies möglicherweise unbeabsichtigt geschieht. Es hat also ein Risiko ohne wirklichen Wert. Es macht Ihren Code nicht wirklich komplizierter, wenn Sie nur zwei Dienstprogrammklassen verwenden. Es gibt sogar eine Compiler-Warnung, um nicht direkt auf statische Methoden zuzugreifen.

Welche Best Practices zum Erweitern von Dienstprogrammklassen zum Hinzufügen benutzerdefinierter/spezifischer Dienstprogrammmethoden?

Zusammengefasst: Die beste Vorgehensweise besteht nicht darin, sie zu erweitern, sondern eine zweite benutzerdefinierte Dienstprogrammklasse zu verwenden.