2008-10-25 19 views
20

¿Es una buena práctica dejar que las clases abstractas definan variables de instancia?Java - ¿Clase abstracta para contener variables?

public abstract class ExternalScript extends Script { 

    String source; 

    public abstract void setSource(String file); 

    public abstract String getSource(); 
} 

La subclase, ExternalJavaScript.class, que a continuación, obtener automáticamente la variable de origen, pero siento que es más fácil de leer el código si todas las clases sub mismos definen la fuente, en lugar de partir de la herencia.

¿Cuál es su consejo?

/Adam

Respuesta

29

Hubiera pensado que algo así sería mucho mejor, ya que está agregando una variable, ¿por qué no restringir el acceso y hacerlo más limpio? Su getter/setters debe hacer lo que dicen en la lata.

public abstract class ExternalScript extends Script { 

private String source; 

public void setSource(String file) { 
    source = file; 
} 

public String getSource() { 
    return source; 
} 

Llevar esto a la pregunta, ¿alguna vez se molesta en buscar en el código de captador/definidor es al leerlo? Si todos ellos obtienen y configuran, entonces no tiene que preocuparse por lo que la función 'hace' cuando lee el código. Hay algunas otras razones para pensar demasiado:

  • Si la fuente estaba protegido (tan accesible por las subclases), entonces el código se complica: ¿Quién es el cambio de las variables? Cuando se trata de un objeto, se vuelve difícil cuando se necesita refactorizar, mientras que un método tiende a facilitar este paso.
  • Si sus métodos getter/setter no están recibiendo y configurando, entonces descríbalos como algo más.

Siempre piense si su clase es realmente algo diferente o no, y eso debería ayudar a decidir si necesita algo más.

6

Seguro .. ¿Por qué no?
Las clases base abstractas son solo una conveniencia para alojar el comportamiento y los datos comunes a 2 o más clases en un solo lugar para la eficiencia de almacenamiento y mantenimiento. Es un detalle de implementación.
Sin embargo, tenga en cuenta que no está utilizando una clase base abstracta donde debería utilizar una interfaz. Consulte Interface vs Base class

1

Por supuesto. La idea general de las clases abstractas es que pueden contener algún comportamiento o datos que requiera que contengan todas las subclases. Piense en el ejemplo simple de WheeledVehicle: debe tener una variable de miembro de núm. Quiere que todas las subclases tengan esta variable. Recuerde que las clases abstractas son una característica muy útil al desarrollar API, ya que pueden garantizar que las personas que amplíen su API no lo rompan.