2009-10-08 5 views
7

Sé que en Java, es una práctica común usar "get" como prefijo de un método de acceso. Me preguntaba cuál es el motivo para esto. ¿Es puramente poder predecir lo que está devolviendo?Méritos/Razones para usar "get" como prefijo en el nombre de un método de acceso

Para aclarar: en algunas clases de Java (p. Ej. String) se puede acceder a una longitud similar a la longitud llamando "longitud()" en lugar de "size()". ¿Por qué se escriben estos métodos de esta manera, pero otros como "getSomeVariable()"?

Gracias por su tiempo.

Editar: bueno ver que no estoy solo sobre la confusión & tales acerca de las variables de tamaño y longitud

Respuesta

8

'conseguir' prefijo (o 'es' para los métodos booleanos que regresan) es una parte de JavaBean especificación que se usa en todo el Java pero principalmente en vistas en la interfaz de usuario web.

longitud() y tamaño() son artefactos históricos de tiempos pre-javabean; muchos desarrolladores de UI lamentaron el hecho de que Collection tenga un método size() en lugar de getSize()

+0

Así que siempre debería usar get como prefijo _unless_ usando una variable como size()? ¿Pero por qué? – bgw

+0

No, debe usar el prefijo 'get' o (opcionalmente) el prefijo' is' para los booleanos SI desea que su clase se ajuste a la especificación JavaBean. 'Collection.size()' existía antes de que se introdujera el concepto de JavaBean y permanece allí por razones de compatibilidad con versiones anteriores; ese no es el ejemplo a seguir. – ChssPly76

+0

¿Está bien no usar get to accessor? – bgw

7

Porque las propiedades son sustantivos y los métodos son verbos. Es parte del patrón de frijoles que está bien establecido y, por lo tanto, es esperado por cualquiera que use su clase.

Podría tener sentido decir:

String txt="I have " + car.GetFuelLevel() + " liters of petrol."; 

o ...

String txt="I have " + car.FuelLevel + " liters of petrol."; 

pero no ...

String txt="I have " + car.FuelLevel() + " liters of petrol."; 

Me refiero a que no tiene sentido para decir "Oye, coche. Ve a FuelLevel para mí". Pero decir "Oye, coche. Ve a GetFuelLevel por mí". Eso es más natural.

Ahora, ¿por qué rompieron rango con String.length() y otros? Eso siempre me ha molestado, también.

+0

la carcasa en sus ejemplos podría usar una vez más. – akf

+1

Probablemente ha estado programando C# recientemente ... – Nate

4

Las convenciones get/set provienen del java Bean specification. Entonces la gente tiende a usar eso.

Y el .size(), .length(), e incluso .length atributo de matrices son todos ejemplos de las fallas de Java para seguir sus propias convenciones. ¡Hay muchos más, es "divertido" descubrirlos!

2

Pueden haber fallas en la especificación, sin embargo, mejoran la legibilidad. tamaño y la longitud le permiten leer la siguiente línea de código:

for (int i=0; i<thing.size(); ++i){ 

como ...

Mientras i es menor que el tamaño de la cosa ...

No hay verdadera convención detrás de esto, pero hace que sea más fácil traducir en una oración directamente.

4

El prefijo get es particularmente útil si también tiene set, add, remove, etc., métodos. Por supuesto, generalmente es mejor tener una interfaz llena de get o llena de set s. Si casi todos los métodos tienen get, entonces se convierte en ruido. Entonces, soltaría el get para inmutables y el set para constructores. Para tipos "fundamentales", como colecciones y cadenas, estas pequeñas palabras también son ruidosas, IMO.

1

La razón histórica fue que la especificación JavaBean establecía que los descriptores de acceso a las propiedades de clase se deberían hacer con getPropertyName/setPropertyName. El beneficio fue que luego podía usar las API de introspección para enumerar dinámicamente las propiedades de un objeto, incluso una que no había compilado previamente en su programa. Un ejemplo de dónde esto sería útil es construir una arquitectura de complemento que necesite cargar objetos y proporcionar al usuario acceso a las propiedades del objeto.

Tiene diferentes nombres para recuperar el tamaño en diferentes clases simplemente porque fueron escritos por diferentes personas y probablemente no existía en ese momento una guía de diseño para nombrar los métodos de clase de manera consistente. Una vez que se escribieron millones de líneas de código con estos nombres inconsistentes, ya era demasiado tarde para cambiar.

Cuestiones relacionadas