2013-04-26 3 views
1

Я пересматриваю класс, чтобы использовать построитель с частным конструктором вместо общедоступных конструкторов. Я хочу, чтобы старые, устаревшие, публичные конструкторы использовали построитель, как показано ниже. (это пример поведения я стараюсь достичь)Может ли конструктор использовать Builder

// old public construcor 
@Deprecated 
public MyClazz(){ 
    return new MyClazzBuilder().Build(); 
} 

Это даст «Не удается вернуть значение из метода с ничтожным типом результата»

ли этот типа функциональности, возможной в Ява? Как это можно достичь?

Update: Этот код является частью распределенной баночки, удаляя старые конструктор не вариант, потому что мне нужно, чтобы поддерживать обратную совместимость

+0

Как вы думаете, что конструктор вернет что-то? это не может быть достигнуто. Только метод может вернуть что-то в Java. – harsh

+0

@harsh Код должен продемонстрировать поведение, которое я пытаюсь достичь. –

+0

, как долго вам нужно быть обратно совместимым? – Woot4Moo

ответ

3

No. Конструкторы работают на объекте, они не делают верни это. [примечание 1]

Один из способов получить эту функциональность - с помощью метода init().

@Deprecated 
public MyClazz() { 
    init(); 
} 

public void init() { 
    // do the actual work 
} 

Теперь ваш строитель может вызвать тот же самый init() способ избежать код в двух местах.

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

[footnote 1] Жизненный цикл объекта java заключается в том, что сначала выделяется память объекта, но все поля имеют нежелательный контент. Затем конструктор запускается в памяти, чтобы преобразовать его в согласованное состояние, изменив все эти бессмысленные значения на реальные значения. Обратите внимание, что память, на которой работает конструктор, уже существует, поэтому вы не можете заменить другой объект вместо построенного. Возвращаемое значение от конструктора будет именно такой заменой, которая не поддерживается языком. Если этот трюк необходим, используйте конструктор/строитель вместо конструктора - конструкторы никогда не смогут этого сделать.

+0

Хм, вы можете уточнить, что вы имеете в виду? – Woot4Moo

+0

Разве это все ясно? Если нет, мне нужен более конкретный вопрос. –

+0

Вы сказали, что конструкторы работают на объекте, просто интересно, можете ли вы это прояснить. Я предполагаю, что вы говорите о распределении пространства и тому подобное, но другие читатели могут этого не делать. – Woot4Moo

1

Конструкторы не возвращают значения. Обратите внимание, что в объявлении конструктора нет «объявленного» типа возврата. У вас есть несколько вариантов:

1) Отметьте конструктор как личный и немедленно устраните ошибки компиляции
2) Измените конструктор и оставьте исходную реализацию там.

Я рекомендую номер 2. То, что вы сделали, - это осуждение конструктора, а затем изменение реализации. Это не так, как работает устаревание.

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