una sirve que poo para interfaces implementacion ejercicios clases clase abstractas abstracta java interface annotations oop idioms

java - poo - para que sirve una clase abstracta



¿Hay un idioma en Java para los métodos vacíos que existen para satisfacer una interfaz? (10)

Digamos que tengo una clase Foo implementando una interfaz como MouseListener . La interfaz de MouseListener consta de cinco métodos, pero solo deseo anular uno de ellos ( mouseClicked() ). ¿Existe una forma estándar e idiomática de formatear los otros métodos?

Mi inclinación fue escribir lo siguiente:

@Override public void mouseClicked(MouseEvent e) { // (...) <-- actual code here } @Override public void mouseEntered(MouseEvent e) { // Do nothing. Exists to satisfy MouseListener interface. } @Override public void mouseExited(MouseEvent e) { // Do nothing. Exists to satisfy MouseListener interface. } @Override public void mousePressed(MouseEvent e) { // Do nothing. Exists to satisfy MouseListener interface. } @Override public void mouseReleased(MouseEvent e) { // Do nothing. Exists to satisfy MouseListener interface. }

Soy un fanático de hacer explícito que los métodos están intencionalmente en blanco en lugar de dejarlos accidentalmente, pero no estoy loco por todo el espacio vertical que se abandona por nada. También he visto el siguiente formato:

public void mouseClicked(MouseEvent e) { // (...) <-- actual code here } public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {}

Generalmente estoy de acuerdo con esto y comprendo la intención del autor, pero se pone muy feo cuando se @Override anotaciones de @Override ( recommended ).

No soy un programador Java especialmente experimentado, así que pensé en preguntar si había una convención. ¿Pensamientos?


El propósito de un oyente es ser notificado de algunos eventos. Si la interfaz del oyente contiene más devoluciones de llamada de los métodos que necesita, entonces simplemente ignore los que no le interesan. En su caso, MouseAdapter fue diseñado para este propósito exacto. No lance UnsupportedOperationException ya que la persona que llama probablemente no espera la excepción. También es muy probable que viole el contrato de la interfaz del oyente ya que se espera que se implemente cada método.


En este caso particular, debe seguir los consejos de wilums2 y extender MouseAdapter en lugar de implementar MouseListener. El propósito de estas clases de adaptador es para que no tenga que proporcionar implementaciones vacías cuando solo está implementando algunos de los métodos de una interfaz.

En general, la respuesta corta es ''no'', no existe una convención estándar sobre cómo documentar métodos vacíos, aunque generalmente uso algo como

@Override void foo() { // No implementation necessary }


En general, se trata de una extensión del Patrón de objetos nulos. Usted está definiendo un Objeto nulo y extendiéndolo solo anulando los métodos que le interesan.

Como ejemplo de una forma de automatizar esto, en mis Anotaciones de JavaDude Bean ( http://code.google.com/p/javadude/wiki/Annotations ), puede hacer algo como lo siguiente. [NOTA: No recomendaría hacer esto para MouseListener, ya que el MouseAdapter ya existe y puede subclasificarlo ... Lo siguiente es útil para otras interfaces grandes donde solo desea implementar algunos métodos de selección]

@Bean(nullObjectImplementations = @NullObject(type=MouseListener.class)) public class MyMouseHandler extends MyMouseHandlerGen { public void mouseClicked(MouseEvent e) { // your handling of a MouseClick } }

Luego puede usar MyMouseHandler para manejar el clic. =

Nota: MouseAdapter fue una muy mala elección para el nombre de la clase en el JRE / JDK. No es una instancia del patrón del adaptador GoF; Es realmente una implementación de objeto nulo de un MouseListener.

Por cierto: puedes poner @ Overcride en la misma línea que la declaración del método - para tu ejemplo puedes tener

@Override public void mousePressed(MouseEvent e) { /* not needed */ } // et al


Encontré esto mientras buscaba esta pregunta exacta. Estoy usando el desplazamiento donde necesito onScrollStateChanged pero no onScroll. Me estaba inclinando hacia

@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { return; }

Sin embargo, me gusta el segundo ejemplo que das (con llaves en la misma línea). Es compacto y limpio y puede expresar constantemente la idea de que se deja en blanco intencionalmente.

Edición: esto es lo que me decidí:

@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {return;}

Este tiene muchos parámetros, por lo que no se ve tan bien como en una línea, pero entiendes la idea.


Hay varias formas de hacerlo. Las convenciones de Oracle java p6.4 (página 11) dicen que los métodos vacíos deben verse como

public void empty() {}

También hay un documento de Steve Yohanan escrito en 2003 y dice

public void empty() { }

Aunque no he encontrado ninguna convención para "método vacío como trozo de interfaz". Entonces, como conclusión, no hay una forma estandarizada de hacer esto. Algunos prefieren dejar un comentario, otros prefieren convertirlo en una sola línea, otros lo escriben como cualquier otro método con un cuerpo en blanco.


Lo hago de la misma manera que tú, si no hay nada, deja en una línea. Tal vez poner un comentario encima de un bloque grande de ''implementaciones de una sola línea''.


MouseAdapter es ideal para este caso específico y el idioma del Adaptador es muy bueno en general. Un adaptador tiene implementaciones vacías de todos los métodos de la interfaz, lo que le permite crear subclases e implementar solo aquellos métodos que sean relevantes para su clase. El Adaptador podría alternativamente, como sugiere Andrew Hare, lanzar las Excepciones de Implicación.


No creo que sea particularmente importante. Para mis gustos personales, no me gusta ver la abrazadera de cierre junto a la apertura, que da:

public void mouseEntered(MouseEvent e) { }

Un poco vacío, pero está bien. En el caso de un valor de retorno, podemos hacer que se vea consistente, lo que no se obtiene con el estilo [] .

Pero cuando se trata del raro caso de los bucles, me gusta un punto y coma ahí:

// Made up example. while (++i < len && str.charAt(i) != ''/0'') { ; }

Lo que daría:

public void mouseEntered(MouseEvent e) { ; }

En el caso de catch cláusulas de catch , es mejor que tenga una buena excusa en un comentario (tal vez dejando caer una interrupción).


Supongo que lo describiría como "implementaciones sin operación" o tal vez usaría el término "adaptador". Como han señalado otros, Java proporciona una clase de MouseAdapter que hace lo que usted quiere. Estrictamente hablando, no se ajusta a la definición del patrón del Adaptador, que transforma una API en otra, pero francamente, tiendo a ser pragmático al nombrar tales cosas.

Probablemente lo más importante que debe hacer es tener claro que pretende que el método no tenga implementación. En el caso específico del MouseAdapter , es probable que no desee ir a lanzar la excepción UnsupportedOperationException , pero en general, es probable que sea una buena señal de que no tiene la intención de proporcionar una implementación. Un comentario en el código fuente (o mejor, la documentación del método) para explicar por qué no está implementando la interfaz por lo general es necesario.


Utilice MouseAdapter