1

Если вы добавили третью подпись для метода, сделайте ли вы, что вторая и третья вариации напрямую вызовите первый (реализованный вариант), или вы делаете третий вызов вторым и вторым вызовами первым.Метод перегрузки стандартного протокола?

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

Мне было интересно, знает ли кто-нибудь о каком-либо «стандартный рекомендованный способ» делать это или, если это более личное предпочтение или зависит от контекста. Я всегда удивляюсь, когда добавляю новую подпись к существующему перегруженному методу. У вас почти всегда есть выбор, как это сделать.

патетически Stupid Пример:

Существующие методы:

public String concatenate(String one, String two, String three) { 
    return(one+two+three); 
} 

public String concatenate(String one, String two) { 
    return(concatenate(one, two, "")); 
} 

Чтобы добавить следующий, я делаю:

public String concatenate(String one) { 
    return(concatenate(one,"","")); 
} 

ИЛИ

public String concatenate(String one) { 
    return(concatenate(one,"")); 
} 

и да, Я знаю, что окончательный метод по существу не-op.

+0

Java право? Возможно, вы захотите использовать язык, который вы используете для набора тегов. – torak

+0

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

ответ

2

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

private String _concatenateBase(String one, String two) 
{ 
    return one + two; 
} 


public String concatenate(String one, String two, String three) 
{ 
    return _concatenateBase(one+two, three); 
} 
+0

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

+0

В моих мыслях перегрузки - это способ выразить концепцию «разные входы, чтобы делать то же самое». Это в основном полезно для клиентов класса: они знают, что делают все методы concatenate, читая это имя. Но в (моем) случае, когда базовый метод является приватным (и немного более сложным, чем пример, может быть), я считаю, что он выполняет другое дело: он реализует поведение, тогда как другие методы * используют * эту реализацию , Конечно, это почти несущественная деталь :) – vulkanino

1

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

Конечно, в некоторых случаях перегрузки не структурированы таким линейным способом: может быть несколько перегрузок, которые все называют одним и тем же «ядром», но которые не могут называть друг друга, если они предоставляют разные параметры.

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