2010-11-26 22 views
17

He estado buscando para encontrar el razonamiento detrás de los parámetros predeterminados para las funciones en Java.Motivo técnico para no tener parámetros predeterminados en Java

Soy consciente de que es posible simular el comportamiento, ya sea con varargs o creando varias funciones sobrecargadas que acepten menos parámetros, y llame a la función real que toma todos los parámetros. Sin embargo, ninguna de estas opciones concuerda con la claridad y la facilidad de uso de, por ej. Sintaxis de C++

¿Alguien sabe si hay una razón técnica sólida que haría algo así como

void myFunc(int a=1, int b=2) {...} 

indeseable o deshacer-poder en una nueva versión de Java?

+1

@Srinivas lo mismo ocurre con el lenguaje que utiliza –

+0

@ Ś.P. jaja ...... –

+0

Como con muchas cosas en Java, la solución es utilizar clunkiness y claridad inherente de IntelliJ :) Java lo convierten en un candidato ideal para entornos de desarrollo. – Alex

Respuesta

4

No conozco un motivo técnico, aparte de que es complicado qué valores se están omitiendo y cuáles no.

Por ejemplo, en su muestra, si solo se transmitió un entero, ¿es a o b el que debe ser predeterminado? Lo más probable es a, pero agrega ese nivel de ambigüedad.

Una solución sencilla sería la de

void myFunc(Integer a, Integer b) { 
    if (a == null) a = 1; 
    if (b == null) b = 2; 

} 

Sí se aliento más largo, y sí que oculta el incumplimiento dentro del código, en lugar de la firma del método (que podría ser mostrado en JavaDoc), pero hace cumplir la consistencia.

+12

No estoy de acuerdo. En C++ no hay ambigüedad - a pesar de que viene en el precio de ser un poco limitado en qué parámetros se pueden especificar (es decir, no se puede dejar que el primero sea por defecto y dar un valor para el segundo). Sin embargo, este es un problema menor cuando tienes un IDE como Eclipse que te dirá cuál es la firma del método. FlexBuilder lo hace bastante bien ... – Kricket

+0

Además de punto de Kelsey, una ventaja de parámetro por defecto es hacer llamada a un método más concisa. Su solución para el valor predeterminado no tiene esta ventaja. – Nicolas

3

No estaba en la versión inicial de Java porque decidieron que no lo necesitaban, probablemente para mantener las cosas simples.

Agregarlo ahora sería complicado, porque debe hacerse de manera compatible con versiones anteriores. La adición de varargs, autoboxing y genéricos en Java5 fue una empresa importante, y solo se podía hacer con funcionalidad limitada (como borrado de tipos) y a costa de una mayor complejidad (las nuevas reglas de resolución de métodos son buenas preguntas para el examen).

Su mejor oportunidad sería con un lenguaje que no sea Java en la JVM. Tal vez uno de ellos ya tiene esto.

+2

maravilloso tiene valores de los argumentos por defecto: http://groovy.codehaus.org/Extended+Guide+to+Method+Signatures#ExtendedGuidetoMethodSignatures-ArgumentswithDefaultValues ​​ –

+1

Así que, básicamente, estás diciendo que es muy difícil y por lo tanto sería más problemas de lo que ¿valor? – Kricket

1

Acepto que los argumentos opcionales agregarían una gran claridad y ahorrarían el enorme trabajo de definir cargas de métodos sobrecargados (llamados telescoping), que no hacen nada más que llamarse entre sí. Sin embargo, el habilitador para esta característica clara es passing arguments by name.

La asociación designada es autodidacta. Por el contrario, la asociación de argumentos posicionales es concisa, pero hace que se consulte la definición de método todo el tiempo para verificar qué argumento se espera en n esta posición en cada invocación. Esto es ridículo y nos motiva a buscar soluciones como Builder pattern. The Builder en realidad resuelve ambos problemas a la vez porque la asociación con nombre es un sinónimo de argumentos opcionales. Pero Builder es útil solo para el usuario. El diseñador de API aún debe perder espacio/tiempo para crear la clase de Constructor. Los fanáticos del patrón pueden estar en desacuerdo, pero es una exageración crear una clase de Constructor para cada método con argumentos nombrados/opcionales. El diseño del lenguaje debería obviar este estúpido patrón. Pero no sé qué tan compatibles son con la lista de argumentos variables.

+0

Claro, hay soluciones temporales, pero lo que estoy buscando es por eso que los diseñadores del lenguaje optaron por omitir esta funcionalidad útil y de apariencia sencilla. – Kricket

+0

Podría ser una omisión pura sin ningún motivo. A veces solo tienes más tareas prioritarias y omites algunas cosas menos importantes. El hecho de que no hicieron ningún esfuerzo para implementar una característica, argumenta a favor de eso. Compare esto con la irritación de que 'super' debe ser la primera declaración en el constructor. Aquí realizaron un esfuerzo serio para evitar la codificación ordenada. Eso es lo que me enfurece y suplica la pregunta seria ya que la gente normal no se esfuerza para hacer daño. – Val

+0

OK, pero está especulando: ¿tiene una fuente para respaldar su reclamo? – Kricket

2

Para evitar la ambigüedad. Reemplazo del método de soporte de Java.

Asumimos el código de abajo:

public int add(int a) { 
    // do something 
} 

public int add(int a, int b = 0) { 
    // do something 
} 

Cuando llamamos add(12), ¿Me puede decir qué función se invoca?

Cuestiones relacionadas