2015-07-08 5 views
3

У меня есть следующий код:Как я могу уменьшить несколько методов, которые принимают 1 параметр разного типа?

public final boolean doesExistById(Long id) { 
    return dataAccessObject.findById(id) != null; 
} 

public final boolean doesExistByName(String name) { 
    return dataAccessObject.findByName(name) != null; 
} 

public final boolean doesExistByDisplayName(String displayName) { 
    return dataAccessObject.findByDisplayName(displayName) != null; 
} 

public final boolean doesExistByWebId(String webId) { 
    return dataAccessObject.findByWebId(webId) != null; 
} 

Мой Product класс имеет свойства id, name, displayName, wedId.
dataAccessObject.findBy____() возвращает объект типа Product, если его можно найти в хранилище данных, или null, если он не может.

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


Возможное решение, я думал бы, чтобы это сделать:

public final boolean doesExist(Long id, String name, String displayName, String webId) {..} 

, а затем вызвать его с null неизвестных полей при использовании if заявления, чтобы определить, какое поле имеет значение. Но есть ли другой способ, который более изящный?

+7

Я думаю, что у вас уже есть хорошо и выглядит чистейшим. –

+0

Я не думаю, что вы можете сделать это лучше. Даже отражение не сделало бы это проще. – EpicPandaForce

+0

Что вы пытаетесь сэкономить, объединив методы в одном? 'isExist (null, name, null, null)' намного хуже, чем 'doesExistByName (name)', и поскольку вы должны указать как значение, так и атрибут (т.е. 'id',' name', 'displayName' и т. д.), вы можете также вставить атрибут в имя метода. – dasblinkenlight

ответ

7

Вы признаете, что «существует» часть всех этих методов является точно таким же, и что делает вы хотите, чтобы избежать повторений этого, но «ByXxx» часть этих методов совершенно иная.

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

Одна вещь, вы можете рассмотреть возможность сделать это отделяя «действительно существует» кусок этого в свой собственный механизм:

public final Optional<MyObj> byId(Long id) { 
    return Optional.ofNullable(dataAccessObject.findById(id)); 
} 

Таким образом, вместо того, чтобы говорить service.doesExistById(123), ты бы сказал service.byId(123).isPresent(). Это означает то же значение семантически, но оно разбито на отдельные части, что означает, что вы можете повторно использовать byId(), byName() и т. Д., Для других целей, где вам нужен фактический объект, а не только для того, чтобы знать, существует ли он.

+1

Это очень хорошее решение. –

+1

Это отличное решение. Для этого требуется переписать еще какой-нибудь код, но я думаю, что это будет лучше работать позже. Благодаря! – yiwei

-2

Вы можете написать метод, который принимает тип объекта Я рекомендую вам ознакомиться с этой страницей. What is reflection and why is it useful?

+0

О, о. Моя рекомендация - избегать отражения, если это не необходимо. Он медленен во время выполнения и нарушает языковые правила. То, что у вас уже есть, намного лучше. –

+0

Как это даже ответ на конкретный вопрос, заданный ОП? – dasblinkenlight

+0

== NULL еще девять - http://stackoverflow.com/questions/271526/avoiding-null-statements-in-java -> ActionNotFoundException – kpie

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