¿Por qué debería sobrecargar los métodos?


Encontré dos ejemplos en mi libro de métodos de sobrecarga, pero no explica claramente exactamente por qué es útil:

package keepo;
public class Main{
    public static void main(String [] args)
    {
        int newScore = calculateScore("Tim", 500);
        System.out.println("New Score is" + newScore);
        calculateScore(75);

    }
    public static int calculateScore(String playerName, int score){
        System.out.println("Player" + playerName +"Has score" + score);
        return score * 1000;
    }
    public static int calculateScore(int score){
        System.out.println("Unnamed player scored" + score + "points");
        return score * 1000;
    }
}

Esto es bastante sencillo, pero honestamente parece bastante inútil sobrecargar el método aquí, y parece simplemente hacerlo por el bien de hacerlo.

El siguiente ejemplo en el libro hace método de sobrecarga que parece un poco más útil, porque ese programa calcula pies a centímetros, y hay un método donde se puede poner en pies y pulgadas, y un método donde se puede poner pulgadas. Sin embargo, todavía parece igual de fácil hacer dos métodos separados para esto.

Dicho esto, ¿hay algún beneficio real al hacer esto? (Leo esto, pero no estoy realmente satisfecho. Parece igual de fácil hacer nuevos métodos.)

Author: Community, 2016-07-23

6 answers

Creo que si hablas de los beneficios reales de la sobrecarga de función/método, algo sin lo cual no te saldrás con la tuya, entonces como has señalado en tu pregunta, no encontrarás ninguno.

Pero ¿cómo es útil? Consideremos este ejemplo.

Supongamos que estoy haciendo una aplicación que encuentra a una persona por su nombre y declaro y defino un método{[12]]}

public Person[] findPerson(String name)

Ahora tenemos un requisito donde tenemos que encontrar a una persona por su fecha de nacimiento, por lo que introducir un nuevo método

public Person[] findPerson_byDOB(Date date)

Supongamos que esto continúa y tenemos estos muchos métodos en mi aplicación.

public Person[] findPerson(String name)
public Person[] findPerson_byDOB(Date date)
public Person[] findPerson_byAddress(Address address)
public Person[] findPerson_bySSN(SSN ssn)
public Person[] findPerson_byDepartment(Department department)
public Person[] findPerson_byMobile(Mobile mobile)

Es solo una parte; esto puede continuar cuando se nos pide que introduzcamos múltiples parámetros, como{[12]]}

public Person[] findPerson_byMobileAndAddress(Mobile mobile, Address address)
public Person[] findPerson_byAddressAndDepartment(Address address, Department department)
public Person[] findPerson_byDOBAndDepartment(DOB dob, Department, department)
public Person[] findPerson_byAddressAndDOB(Address address, DOB dob)

Y muchos, muchos más...

Si bien esto puede parecer un poco exagerado, confía en mí, al hacer una aplicación real a nivel de la industria, podemos encontrarnos con una situación en la que obtenemos cientos y cientos de métodos como este, y en última instancia, tenemos un catálogo de todos estos métodos de lo que realmente hacen.

En realidad es una pesadilla cuando tendremos que encontrar el nombre de todos estos métodos cuando tendríamos que usarlo.

Sin embargo, cuando todos los parámetros son diferentes, podemos darle el mismo nombre a la función y realmente se vuelve muy fácil de recordar.

public Person[] findPerson(String name)
public Person[] findPerson(Date date)
public Person[] findPerson(Address address)
public Person[] findPerson(SSN ssn)
public Person[] findPerson(Department department)
public Person[] findPerson(Mobile mobile)
public Person[] findPerson(Mobile mobile, Address address)
public Person[] findPerson(Address address, Department department)
public Person[] findPerson(DOB dob, Department, department)
public Person[] findPerson(Address address, DOB dob)

Ahora como David señaló en su respuesta, todos sabemos cómo obtener String valor de entero; probablemente lo hemos leído en alguna parte.

static String.valueOf(new Integer(1));

Pero ¿sabes cuántos métodos más hay que están sobrecargados con el mismo nombre?

static String.valueOf(boolean b)
static String.valueOf(char c)
static String.valueOf(char[] data)
static String.valueOf(double d)
static String.valueOf(float f)
static String.valueOf(int i)
static String.valueOf(long l)
static String.valueOf(Object obj)

Los beneficios son que no tienes que memorizarlos todos. Ni siquiera tienes que adivinar porque es el mismo nombre hasta el final.


EDITAR según el consejo de Namnodorel

Considere este método sobrecargado de la clase PrintStream.

void println()
void println(boolean x)
void println(char x)
void println(char[] x)
void println(double x)
void println(float x)
void println(int x)
void println(long x)
void println(Object x)
void println(String x)

Basta con pensar en la legibilidad si tuviéramos que escribir:

void println_emptyLine()
void println_boolean(boolean x)
void println_character(char x)
void println_characterArray(char[] x)
void println_double(double x)
void println_float(float x)
void println_integer(int x)
void println_long(long x)
void println_object(Object x)
void println_string(String x)
 63
Author: Raman Sahasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:25

La sobrecarga es útil cuando crea métodos que hacen lo mismo con valores de tipo diferente.

Math la clase proporciona un ejemplo perfecto-tiene grupos de sobrecarga de funciones por tipo-cuatro abs, cuatro min, cuatro max, y así sucesivamente:

int max(int a, int b) {...}
float max(float a, float b) {...}
long max(long a, long b) {...}
double max(double a, double b) {...}

Una alternativa sin sobrecarga le obligaría a "codificar" el tipo en el nombre de su método, por ejemplo, Math.intMax(a, b) lo que sería perjudicial para la legibilidad del código del usuario.

 22
Author: dasblinkenlight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-23 01:46:30

Ser simple y conciso: La sobrecarga es solo una posibilidad proporcionada por Java (pero la mayoría de los lenguajes modernos y flexibles la usan) (y otros lenguajes como C++ o C#) para permitir a los desarrolladores crear para un mismo nombre de método/función, varios de ellos.

¿Por qué ?
Porque la nomenclatura de métodos es importante y la nomenclatura de métodos debe transmitir el comportamiento de la misma. Por lo tanto, si dos métodos tienen el mismo comportamiento (Convertir a una cadena, por ejemplo) pero que uno utiliza un largo como entrada y que el otro utiliza un int como entrada, ¿por qué tener un nombre de método diferente ?

    String myString = String.valueOf(new Integer(1));
    String myOtherString = String.valueOf(new Long(2));


La intención y el objetivo son los mismos, solo los parámetros de entrada cambian.

Cuando la sobrecarga es significativa, debe usarla en lugar de crear algunas variantes de nombres torpes.

 2
Author: davidxxx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-23 18:45:11

La sobrecarga del método es útil en el siguiente escenario:

Considere que tiene una clase que realiza un seguimiento de una lista de nombres. Tiene el estilo de código anterior, donde cada método tiene su propia opinión sobre la realización de operaciones en esta lista de nombres.

De repente, la representación interna de la lista cambia (tal vez de un array a un ArrayList, realmente no importa). Quieres ser el responsable de refactorizar cada. single . método?

Método la sobrecarga es útil porque entonces puede enrutar todas las operaciones a través de un único método genérico. Esto significa que cada vez que una representación interna cambia, solo tiene que cambiar ese método genérico, y todos sus otros métodos especializados siguen funcionando igual.


También, considere su ejemplo proporcionado. ¿Qué sucede si desea cambiar la forma en que el programa imprime el mensaje? Tendrás que modificar ambos métodos para imprimir el mismo tipo de mensaje, una pesadilla de mantenimiento. Asegúrese, parece pequeño ahora, pero piensa en cuando tu proyecto crezca, y empiezas a tener muchos más métodos que dependen de este formato de mensaje (efectivamente fijo).

 1
Author: Jeeter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-23 01:46:01

Soy un objeto y tengo una capacidad, la capacidad es fija, pero puede aceptar varios parámetros.

Si la capacidad puede aceptar 1000 tipos de parámetros, ¿quieres romper tu cerebro para pensar en 1000 nombres de capacidad?

Tomar otros post como una buena práctica de sobrecarga y tomar lo que JNIEnv hacer como una mala práctica causa C no soporta la sobrecarga.

CallStaticObjectMethod,
CallStaticObjectMethodV,
CallStaticObjectMethodA,
CallStaticBooleanMethod,
CallStaticBooleanMethodV,
CallStaticBooleanMethodA,
CallStaticByteMethod,
CallStaticByteMethodV,
CallStaticByteMethodA,
CallStaticCharMethod,
CallStaticCharMethodV,
CallStaticCharMethodA,
CallStaticShortMethod,
CallStaticShortMethodV,
CallStaticShortMethodA,
CallStaticIntMethod,
CallStaticIntMethodV,
CallStaticIntMethodA,
CallStaticLongMethod,
CallStaticLongMethodV,
CallStaticLongMethodA,
CallStaticFloatMethod,
CallStaticFloatMethodV,
CallStaticFloatMethodA,
CallStaticDoubleMethod,
CallStaticDoubleMethodV,
CallStaticDoubleMethodA,
CallStaticVoidMethod,
CallStaticVoidMethodV,
CallStaticVoidMethodA,

Reger to JNI for more detailed struct definition

 1
Author: Gearon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-23 02:28:23

Otra razón para sobrecargar es proporcionar uno o más argumentos predeterminados.

Considere lo siguiente:

class Something {
    // Imagine that this is a real class, that does real work.

    public void doSomething(boolean b, char c, double d, int i) {
        // Imagine that this is one of the main components of class Something.
        System.out.println("Hi. You passed: " + b + ", " + c + ", " + d + ", and " + i + ".");
    }

    public void doSomething(boolean b, char c, double d) {
        doSomething(b, c, d, 42);
    }

    public void doSomething(boolean b, char c) {
        doSomething(b, c, 1.3579);
    }

    public void doSomething(boolean b) {
        doSomething(b, 'q');
    }

    public void doSomething() {
        doSomething(true);
    }
}

En este ejemplo, cada sobrecarga proporciona un valor predeterminado para uno de los parámetros, encadenándolos juntos hasta obtener una llamada completa a la versión de doSomething() que realmente hace el trabajo.

Something s = new Something();
Something t = new Something();
Something u = new Something();

// ...

s.doSomething(true, 'c', 2.9);
t.doSomething(false, 'z');
u.doSomething();

Ver aquí para un ejemplo.

 1
Author: Justin Time,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-23 23:18:30