Разработка шаблона для "toString" стороннего объекта - PullRequest
3 голосов
/ 15 сентября 2011

У меня есть сторонний объект, который использует метод toString, унаследованный от Java.lang.Object.Этот метод довольно бесполезен.Однако я не могу думать о чистом дизайне, чтобы переопределить это поведение.Ниже представлены различные подходы.

  1. Подкласс и переопределение метода toString.

Проблема : если какие-либо внутренние вызовы исходного объекта вызывают toString и проверяютвозвращенная строка, они теперь сломаются.Я не хочу ломать существующий объект или предполагать что-либо о чистоте стороннего кода.

Создайте StringFactory с методом createString. Этот метод вызывает toString для всех объектов, кроме моего стороннего объекта, о котором идет речь, но для моего объекта строит строку в моем собственном порядке.

Проблема : я не могу требовать, чтобы все передавалось методу createString и никогда не вызывалось toString напрямую (это было бы нелепо для большой базы кода), и я не мог легко вспомнить, какие объекты должны быть переданы, потому чтодля них есть своя логика.

У кого-нибудь есть шаблон дизайна, который кажется чистым?

Ответы [ 3 ]

5 голосов
/ 15 сентября 2011

Мне очень нравится ответ Богемиана.

Имея это в виду, ООП-способ его решения будет

class My3rdPartyClassFormatter {
    private My3rdPartyClass data;
    public My3rdPartyClassFormatter(My3rdPartyClass d) { this.data = d; }
    public String toString() { 
        // impl here
    }
}
5 голосов
/ 15 сентября 2011

Просто используйте статический метод в классе утилит:

public class MyUtils {

    public static String toString(My3rdPartyClass obj) {
        // impl here
    }
}
2 голосов
/ 15 сентября 2011

Использовать прокси . Ваш обработчик вызовов будет перехватывать все вызовы стороннего объекта. В большинстве случаев он просто пропустит их. Однако реализуйте свою собственную логику toString.

InvocationHandler handler = new InvocationHandler
{
       private ThirdParty thrd ;

       public Object invoke ( Object proxy , Method method , Object [ ] args ) throws Throwable
       {
             if ( method . getName().equals ( "toString" ) )
             {
                  return "useful string" ;
             }
             else
             {
                  return method . invoke ( thrd , args ) ;
             }
       }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...