2010-02-05 12 views
39

que tienen clase y el método en los nombres largos de javaclase o método de alias en java

LONGGGGGGGGGGGGGGGClass.longggggggggggggggggggggggggMethod(); 

Quiero poner un alias a g.m(); en otra clase puede hacerse esto?

+0

¿Qué quiere decir con "alias it g.m()"? ¿Por qué quieres copiar tu clase looong a alguna otra clase? – Thunderhashy

+12

'LONGGGGGGGGGGGGGGClass' no es un nombre de clase razonable, lo cambiaría de todos modos ...;) –

+2

Ya sabes, si aprendes a tocar el tipo, los nombres de larga clase y método no te molestarán demasiado. –

Respuesta

9

Puede usar herencia o encapsulación para envolver la clase original.

class g extends LONGCLASS 
{ 
    void a() { super.loooonnng(); } 
} 

o

class g 
{ 
    private LONGCLASS lc; 
    void a() { lc.loooonnng(); } 
} 
+0

-1 'base' es C#, el OP habla Java así que use' super' y como @erickson dijo, este es también un método estático así que esto no funcionará de todos modos. –

+1

Mediante su uso de * Class.method(). Además, si estaba usando una variable de objeto, como han señalado otros, usar un nombre de variable breve sería trivial, ya que definiría eso en su propia clase/métodos; sin embargo, el nombre de la clase no puede cambiar aparentemente. –

+0

Esto no es posible en muchos casos. Por ejemplo, ¿qué pasa si estás mirando las clases generadas por jaxb en las que se está deserializando un documento xml? No importa cuántas veces extienda la clase, se ignorará por completo. Tampoco funciona realmente si tienes métodos/campos estáticos (que están en la publicación del OP), o si tienes una clase final. –

39

lo envuelve en un método con un nombre que le guste más.

+3

Le daré un +1, aunque me gustaría señalar que si llama a un método con la frecuencia suficiente para que esto valga la pena, es probable que necesite algunas refactorizaciones. –

+20

Cuenta K, si tiene que usar un código con nombres como ese, y no le gustan, probablemente no es el código que usted controla. –

14

Actualmente es una forma de obtener 1/2 de lo que buscas.

En cuanto a su ejemplo:

LONGGGGGGGGGGGGGGGClass.longggggggggggggggggggggggggMethod(); 

Parece que longggggggggggggggggggggggggMethod es estática. (Si no lo fuera, que estaría prefijándolo con un nombre de variable, lo que permite controlar el tamaño de.)

Puede utilizar Java's static import feature a 'alias' o importación los métodos estáticos de la LONGGGGGGGGGGGGGGGClass en su espacio de nombres de la propia clase. En lugar de que el código anterior, sólo tendría que escribir esto:

longggggggggggggggggggggggggMethod(); 
+2

Tenga en cuenta que esto no estará disponible para fuente previa a Java 6 –

25

Por un lado, debe ser rara vez al escribir el nombre de la clase. Es posible que tenga algo como esto:

import DamnLongPackageNameThatIDontLikeTyping; 

class MyCoolClass() 
{ 
    DamnLongClassNameThatIDontLikeTyping dlc=new DamnLongClassNameThatIDontLikeTyping(); 
    dlc.this(); 
    dlc.that(); 
    dlc.tOther(); 
    dlc.damnLongAnnoyingMethodNameStillHasToBeTypedEveryTime(); 
} 

bien, así que no está muy bien, pero que no se debe escribir todo el nombre de la clase muy a menudo, solo cuando se declara un primer momento; y la importación del paquete lo hace para que no tenga que escribir: DamnLongPackageNameThatIDontLikeTyping.DamnLongClassNameThatIDontLikeTyping todo el tiempo.

Aún así, puede ser molesto escribir. Ingrese el editor. Si no está usando Eclipse, Netbeans o IntelliJ, entonces realmente necesita dejar de leer en este momento e ir a instalarlo: cargue su proyecto. Esperaré ...


Seriamente. Ve a buscarlo. El resto de esto no será divertido sin eso.


Ahora, lo realmente interesante es que para conseguir lo que he escrito más arriba, que acaba de hacer esto:

class MyCoolClass() 
{ 
    DLC<ctrl-space> 

Después de escribir esto, el archivo se vería así:

import DamnLongPackageNameThatIDontLikeTyping; 

class MyCoolClass() 
{ 
    DamnLongClassNameThatIDontLikeTyping<your cursor here> 

Ten en cuenta que no escribiste malditamente ALGO, solo contenido descargable. Se dio cuenta de qué clase deseabas importar, agregó una importación y atascó la clase allí. (Puede que tenga que elegir de una lista de clases si hay más de una coincidencia).

Además de eso, una vez que tenga un objeto denominado DLC instancia puede escribir:

dlc.<ctrl-space> y obtener una lista de los métodos de esa clase. NUNCA VUELVA A TIPO A NOMBRE DEL MÉTODO. Si hay un método kagillion en su clase, no se desplace sobre ellos, escriba: dlc.dLAM<ctrl-space> para obtener dlc.damnLongAnnoyingMethodNameStillHasToBeTypedEveryTime();

Nunca vuelva a escribir un nombre de método largo.

No hay nombres de métodos largos, no hay nombres de clase largos, no hay nombres de paquetes largos. Sin embargo, obtienes métodos, paquetes y clases extremadamente legibles. Esta es la razón por la cual los programadores de Java tienden a usar estos nombres largos, también tratamos de recordar que estamos codificando para el próximo tipo y no queremos que tenga que correr por todo nuestro código tratando de descubrir qué:

g.m(); se refiere a - forzarlos a recordar que en esta clase significa GreatClass.motion, pero en la siguiente clase significa Grey.modifyColor - eso sería realmente cruel.

Java está estáticamente tipeado coloca MUCHA potencia en el editor. Puede hacer cosas que ni siquiera sueña con hacer con lenguajes de tipado dinámico, y debe jugar con la fuerza de su idioma para ser un programador efectivo; no intente adaptar cada idioma a un estilo que haya aprendido al utilizar otro idioma. .

Tenga en cuenta que esto funciona para los métodos estáticos, así ...

DLC<ctrl-space>.dLM<ctrl-space> sería reemplazado por una llamada a DamnLongClass.damnLongMethod(), y sería incluso incluir los parens para usted en 9 pulsaciones de teclas.

+7

Tiene razón, por supuesto. Pero ** legibilidad ** también es un factor de calidad para el código. En mi caso, tengo muchas clases autogeneradas, y como sucede con cada paquete, hay una 'ObjectFactory' por ejemplo. Cuando ahora uso 'ObjectFactory' desde dos paquetes, necesito ** calificarlos completamente ** con su paquete. Así que obtengo 'com.longCompanyName.longProjectName.carStorageProvider.ObjectFactory' por todas partes. ¿Cómo anhelo 'import com.longCompanyName.longProjectName.carStorageProvider.ObjectFactory como CarFactory'.(No puedo darle los dos ejemplos completos aquí, porque mi espacio de comentarios se agotó) – towi

+1

@towi He comenzado a empaquetar esas clases (con nombres muy genéricos que están en varios lugares) dentro de otra clase. Es decir. una clase CarStorageProvider en lugar de paquete. De esta forma, puede importar CarStorageProvider y luego hacer referencia a ObjectFactory como CarStorageProvider.ObjectFactory. También 'ayuda' con ClassBloat (al menos en lo que se refiere al IDE) – Stefan

+0

@towi Stefan tiene toda la razón, si incluye dos ObjectFactories en múltiples áreas, ciertamente está rompiendo el Principio de Responsabilidad Individual y probablemente algunas otras reglas. Al consolidarlos en una nueva clase, encontrará que siempre necesitó esa clase y tendrá un lugar para mover mucho más código que haya duplicado de otras clases (los que importaron los dos ObjectFactories al menos) –

20

El lenguaje Java no proporciona ningún mecanismo de aliasing.

Sin embargo, se podría aliviar su "dolor" algo por alguna combinación de los siguientes:

  • Para los métodos estáticos, puede utilizar las importaciones estáticas para evitar que el nombre de la clase de largo.

  • Se podría declarar su propia clase de conveniencia con un nombre corto y el método a corto nombres, y poner en práctica los métodos estáticos para delegar en los métodos reales como:

    pública shortName static void (...) { VeryLongClassName .veryLongMethodName (...); }

  • Para los métodos normales, puede implementar una clase Wrapper, o una subclase con nombres de métodos más convenientes. Sin embargo, ambos tienen inconvenientes desde el mantenimiento y (dependiendo de su JVM) perspectivas de rendimiento.

pero deja paso atrás:

  • Si el problema real es que se acaba harto de escribir los nombres largos, una solución es utilizar un IDE moderno que soporta la terminación de nombres a medida que escríbalos Ver la respuesta de @ BillK, por ejemplo.

  • Si el problema real es que está harto de que los nombres largos lleven demasiado espacio, una solución es usar una pantalla más ancha/líneas más largas.La mayoría de los monitores son lo suficientemente grandes como para mostrar código fuente de 120 caracteres (o más) sin fatiga visual.

  • Si ninguno de los anteriores es la respuesta, considere refaccionar el código ofensivo para utilizar nombres de clases y métodos sensibles (es decir, más cortos). Una vez más, un IDE moderno puede manejar este tipo de refactorización de forma rápida y segura.

En el último punto, considero que los nombres de las clases excesivamente largos y nombre de los métodos mal estilo. OMI, está justificado tomarse el tiempo para arreglarlo usted mismo o sugerir que se solucione, especialmente si constituye una API "pública" para alguna biblioteca o módulo.

0
public class Shorten 
{ 

    public static final Shorten m = new Shorten(); 

    public int a(params) 
    { 
     return some_method_with_long_name(params); 
    } 

    public void b() 
    { 
     // whatever static code you want 
    } 
} 

En su código principal a continuación:

import static mypackage.Shorten.m; 
... 
int res = m.a(params); 
m.b(); 
... 

De esta manera efectivamente alias de cualquier material estático que desee, evitando al mismo tiempo las advertencias.

Cuestiones relacionadas