Как препятствовать тому, чтобы метод перегрузился в Java?

Переопределение метода может быть предотвращено при помощи ключевого слова final, аналогично, как предотвратить перегрузку?

11
задан Joachim Sauer 7 June 2010 в 07:52
поделиться

7 ответов

Вы не можете сделать это в Java.

Перегруженный метод - это, по сути, просто еще один метод.

Попытка может выглядеть (что-то) вроде этого

void yourMethod(String arg) { /* ... */ }

void yourMethod(String arg, Object... prevent) {
    throw new IllegalArgumentException();
}

но она не сработает, поскольку Java разрешает перегрузку, рассматривая "наилучшее соответствие" или "наиболее специфическую сигнатуру".

Метод все еще может быть перегружен с помощью a

void yourMethod(String arg, String arg2) { /* ... */ }

который будет вызываться при выполнении yourMethod("hello", "world").

Кстати, почему вы хотите предотвратить перегрузку? Возможно, есть другой способ сделать то, что вы хотите?

13
ответ дан 3 December 2019 в 02:40
поделиться

Эээ ... какой смысл не разрешать перегрузку метода?

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

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

Тем не менее, перегрузку нельзя остановить, как уже писали другие.

4
ответ дан 3 December 2019 в 02:40
поделиться

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

-2
ответ дан 3 December 2019 в 02:40
поделиться

​​Если вы перегружаете метод, вы создали метод с тем же именем, но с разными типами параметров. В Java метод определяется (частично) в терминах своих параметров, и, таким образом, если два метода имеют одно и то же имя, но разные параметры, то они являются яблоками и апельсинами, то есть не одинаковы. Короче говоря, вы не можете помешать кому-либо создавать новые методы в классе, что, по сути, именно то, о чем вы просите.

0
ответ дан 3 December 2019 в 02:40
поделиться

Вы не можете. Потому что это почти бессмысленно.

Если вы хотите перегрузить метод handle(...), но вам это запрещено, то вместо него вы создадите doHandle(...).

Какой перегруженный метод будет использоваться, определяется во время компиляции (в отличие от переопределенных методов, которые определяются во время выполнения). Таким образом, смысл перегрузки заключается в использовании общего имени для общих операций. Запрет на это - скорее вопрос стиля кода, чем что-то еще.

14
ответ дан 3 December 2019 в 02:40
поделиться

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

-1
ответ дан 3 December 2019 в 02:40
поделиться

Пометить класс final, и он не может быть расширен. Однако это может нарушить некоторые другие цели.

3
ответ дан 3 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: