открытый (статический) метод swap () и избыточные (нестатические) приватные - PullRequest
0 голосов
/ 03 мая 2010

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

Часто нескольким структурам данных необходимо поменять местами некоторые элементы в базовом массиве. Поэтому я реализую метод swap () в ADT1, ADT2 как частный нестатический метод. Хорошая вещь заключается в том, что, будучи закрытым методом, мне не нужно проверять параметры, плохая вещь заключается в избыточности. Но если я помещаю метод swap () в вспомогательный класс в качестве публичного статического метода, мне нужно каждый раз проверять правильность индексов, делая вызов swap очень неэффективным, когда выполняется много свопов.

Так что мне делать? Пренебрегать снижением производительности или писать небольшой, но избыточный код?

Ответы [ 3 ]

5 голосов
/ 03 мая 2010

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

Кроме того, какую проверку вы все равно делаете? Разве естественно не выброшено ArrayIndexOutOfBoundsException и / или NullPointerException достаточно хорошо?


Ничего не стоит, пока public static Collections.swap(List<?>,int,int) , java.util.Arrays перегружает (для int[], long[], byte[], etc) все private static.

Я не уверен, что Джош Блох когда-либо прямо говорил, почему он это сделал, но можно предположить, что это как-то связано с пунктом 25 его книги Effective Java 2nd Edition : Предпочитают списки для массивов . Да, при использовании List произойдет «снижение производительности», но оно незначительно, и многие преимущества более чем восполняют его.

2 голосов
/ 03 мая 2010

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

1 голос
/ 03 мая 2010

Всегда лучше, чтобы ваш код был менее эффективным, чем дублировался (некоторые постоянные вызовы невелики). По крайней мере, так преподается в моем университете.

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

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

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