Как предотвратить перегрузку метода в Java? - PullRequest
11 голосов
/ 07 июня 2010

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

Ответы [ 8 ]

14 голосов
/ 07 июня 2010

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

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

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

13 голосов
/ 07 июня 2010

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

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

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

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

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

но это не сработает, поскольку Java разрешает перегрузку, просматривая «лучшее совпадение» или «наиболее конкретную сигнатуру».

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

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

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

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

4 голосов
/ 07 июня 2010

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

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

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

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

3 голосов
/ 07 июня 2010

Отметьте финал класса, и он не может быть расширен.Это может победить какую-то другую цель.

0 голосов
/ 27 мая 2016

простой! не вызывайте этот перегруженный метод.

public class Test
{

   public void m(int a)
     {
       *your definition*
     }
public void m(float a)
     {
       *your definition*
     }
}
public static void main(Strings [] args)
{
  Test t=new Test();
  t.m(5);
}
0 голосов
/ 07 июня 2010

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

0 голосов
/ 07 июня 2010

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

0 голосов
/ 07 июня 2010

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

...