Последние 10 лет я занимаюсь научными исследованиями по различным вопросам, связанным с удобством использования API в Java.
Я могу вам сказать, что утверждение о том, что есть один способ сделать что-то в Java, довольно неверно. Часто есть много способов сделать то же самое в Java. И, к сожалению, они часто не соответствуют или задокументированы.
Одной из проблем, связанных с раздуванием интерфейса класса с помощью удобных методов, является то, что вы усложняете понимание класса и способы его использования. Чем больше у вас выбора, тем сложнее все становится.
В анализе некоторых библиотек с открытым исходным кодом я обнаружил случаи избыточной функциональности, добавленной разными людьми с использованием разных терминов. Очевидно, плохая идея.
Еще большая проблема заключается в том, что информация, которую несет имя, больше не имеет смысла. Например, такие вещи, как putLayer и setLayer в колебании, когда один просто обновляет слой, а другой также обновляет (угадайте, какой?), Являются проблемой. Аналогично, getComponentAt и findComponentAt. Другими словами, чем больше способов сделать что-то, тем больше вы запутываете все остальное и уменьшаете «энтропию» вашей существующей функциональности.
Вот хороший пример. Предположим, вы хотите в Java заменить подстроку внутри строки другой строкой. Вы можете использовать String.replace (CharSequence, CharSequence), который работает идеально, как и следовало ожидать, литерал для литерала. Теперь предположим, что вы хотите заменить регулярное выражение. Вы можете использовать Java Matcher и выполнять замену на основе регулярных выражений, и любой сопровождающий поймет, что вы сделали. Однако вы можете просто написать String.replaceAll (String, String), который вызывает версию Matcher. Однако многие ваши сопровождающие могут не знать об этом и не осознавать последствий, в том числе тот факт, что замещающая строка не может содержать «$». Таким образом, замена "USD" на "$" будет хорошо работать с replace (), но вызовет сумасшедшие вещи с replaceAll ().
Возможно, самая большая проблема, однако, заключается в том, что «делать то же самое» редко является проблемой использования одного и того же метода. Во многих местах в Java API (и я уверен, что и в других языках) вы найдете способы сделать «почти то же самое», но с различиями в производительности, синхронизации, изменениях состояния, обработке исключений и т. Д. Например, один вызов будет работать прямо, в то время как другой установит блокировки, а другой изменит тип исключения и т. д. Это рецепт проблемы.
Итак, суть: несколько способов сделать одно и то же не очень хорошая идея, если они не являются однозначными и очень простыми, и вы уделяете много внимания обеспечению согласованности.