2012-03-21 2 views
7

Я пытаюсь написать свою первую библиотеку, но я все еще сталкиваюсь с некоторыми проблемами дизайна.Библиотеки писем Java

Моя библиотека ожидает много конфигурации, для которой я создал интерфейсы и классы по умолчанию Impl, но теперь моей библиотеке требуется много взаимодействия с вызовом снаружи. Это также делается через интерфейсы, но у меня возникает ощущение, что пользователь вынужден переопределить слишком много методов, которые возвращают только ошибку по умолчанию или даже null. Есть ли какой-нибудь более удобный способ сделать все эти «вы можете, но не нужно» выполнять части, более необязательные?

ответ

10

Даже если вы создаете интерфейс, часто также имеет смысл создать абстрактный базовый класс, который пользователи вашей библиотеки могут расширить, чтобы реализовать интерфейс.

Абстрактный базовый класс может обеспечить стандартные реализации методов, чтобы пользователь библиотеки не нуждался в их создании. Он также может определять абстрактные методы, которые пользователь API должен реализовать, если они хотят создать конкретный подкласс.

public abstract class MyBaseClass implements MyInterface { 
    // abstract method 
    // anyone who extends must implement this  
    public abstract void myMethod1(); 

    // default error implementation 
    // overriding is optional, but if used it will throw an error 
    public void myMethod2() { 
     throw new UnsupportedOperationException(); 
    } 

    // default implementation that subclasses may find useful: 
    public void doBothMethods() { 
     myMethod1(); 
     myMethod2(); 
    } 
} 
+3

Для некоторых хороших примеров этого, посмотрите ['java.util.AbstractCollection'] (http://docs.oracle.com/javase/6/docs/api/java/util/AbstractCollection.html) и его подклассы. – Taymon

2

Это, безусловно, область, где не было идеального подхода. Он был признан таковым, и он был рассмотрен с использованием public defender methods. Ссылка приведет вас к (официальному) предложению по улучшению языка.

Поэтому я бы рекомендовал вам придерживаться интерфейсов и предоставлять стандартные реализации каждого метода с использованием статических методов библиотеки. Таким образом, вы будете готовы, когда станет доступен способ добросовестного защитника.

Смежные вопросы