2010-12-14 20 views
8

Tengo una clase Producto y una interfaz LargeProduct. El producto implementa LargeProduct.No se puede asignar el campo final, para una interfaz

LargeProduct tiene una altura variable que tiene métodos getter y setter que deben implementarse en la clase Product.

La variable altura de LargeProduct se define así:

public int height = null; 

El método getter funciona bien:

public int getHeight() { 
    return height; 
} 

Sin embargo, el método de selección no se:

public void setHeight(int height) { 
    this.height = height; 
} 

errores:

The final field LargeProduct.height cannot be assigned 
The static field LargeProduct.height should be accessed in a static way 

No estoy seguro de cuál es el error que realmente está dando ... Estoy usando Eclipse y cuando cierro el mouse da el primer error, y en la parte inferior de la ventana aparece el segundo error.

+2

Una interfaz define el contrato entre un llamante y un destinatario. Los métodos y constantes son parte de ese contrato, no campos. (Si fuera así, no necesitarías un getter o setter) Si quieres que un padre defina un campo, utiliza una clase abstracta. –

Respuesta

15

Interfaces sólo puede incluir constantes, no variables de propósito general. Las interfaces deben contener solo constantes si son genuinamente relevantes para el resto de la interfaz, y deben usar SHOUTY_CASE como cualquier otra constante. Parece que LargeProductno debe tener una constante llamada height - pero, en su lugar, su implementación debe declarar el campo height.

Tenga en cuenta que las interfaces están destinadas a ser API, que muestran las capacidades de los tipos. Los campos no deben formar parte de la API; son un detalle de implementación . Después de todo, ¿quién puede decir que escribirás getHeight y setHeight según una variable simple? Esos métodos podrían consultar una base de datos o delegar en una instancia de algún otro tipo. El consumidor de la interfaz no debería saber o preocuparse por eso.

Para más información acerca de los campos en las interfaces, le sugiero que lea section 9.3 of the Java Language Specification:

Cada declaración de campo en el cuerpo de una interfaz es implícitamente pública, estática y final. Se permite especificar redundantemente alguno o todos estos modificadores para tales campos.

+2

¿Qué? Entonces, ¿no puedo almacenar ciertas variables para ciertas interfaces? – Matt

+0

@Matt: No. Editaré para explicar. –

+0

@Jon final es la cuestión clave aquí Compruebe http://stackoverflow.com/questions/4438228/the-final-field-cannot-be-assigned-for-an-interface/4438277#4438277 –

0

No puede asignar un valor a un campo final. Declarar la altura en producto como

private int height; 
+0

No se declaró final: S – Matt

+2

@Matt: Sin embargo, es implícitamente definitivo, porque está declarado en una interfaz. –

1

Por defecto de los campos (variables miembro) en la interfaz son public static final de

y que no tienen colocador de última variable de

2

La altura en LargeProduct es definido como lo siguiente:

public int height = null; 

Las variables definidas en las interfaces son implícitamente static y final, es decir, constantes. De eso se queja el compilador.

No se puede definir una variable de instancia en una interfaz. Simplemente déjalo fuera: los métodos get y set aseguran que las clases se puedan usar como se espera. La variable real es un detalle de implementación si las clases implementadas.

+0

Este es el crux - las variables de interfaz son _implicitly_ 'final'. Esto resolvió mi problema. – boettger1

0

Exactamente org.life.java! ¡Y no puedes modificar una variable final estática! Porque es la forma de determinar una constante en Java.

Cuestiones relacionadas