Forzar subclases para establecer una variable en java

Estoy desarrollando en Android y tengo una situación relativamente simple que estoy tratando de implementar de la mejor manera posible.

Simplemente, tengo una clase que define todos los parámetros básicos para una pantalla determinada. Desde aquí cada pantalla de la aplicación es una subclase de esta. Necesito que cada pantalla (es decir, subclase) establezca el valor de una variable en su implementación (es decir, cada pantalla debe definir qué nivel es en un árbol de navegación).

Además, idealmente, esta variable debe ser final cuando se establece en las subclases (me doy cuenta de que esto probablemente no es posible).

¿Cuál es la mejor manera de hacer esto? ¿Existe una manera de aplicar correctamente este tipo de comportamiento en Java?

2 Solutions collect form web for “Forzar subclases para establecer una variable en java”

El comentario de @ pst lleva a esta solución.

Esto no se puede hacer con una variable. Pero una clase abstracta puede requerir que se implemente un método particular: este método podría devolver el valor aplicable

De declarar una función abstract para establecer o devolver la variable, puede obligar a cualquier subclase a implementarla correctamente.

A continuación, la función debe ser llamada por cada subclase individual de la clase externa. Esto implica que debe hacerse en alguna parte de la clase externa. Esto se puede hacer en el constructor sin argumentos de la clase externa sin tener que preocuparse por las subclases que llaman super :

Nota: Si un constructor no invoca explícitamente un constructor de superclase, el compilador Java inserta automáticamente una llamada al constructor sin argumentos de la superclase. Si la superclase no tiene un constructor sin argumento, obtendrá un error en tiempo de compilación. El objeto tiene tal constructor, así que si el objeto es la única superclase, no hay problema. (Documentos Java: Super)

En base a esto, esta solución se mantendrá y forzará correctamente la variable que se establecerá siempre y cuando:

  1. No se crea ningún otro constructor en la superclase (por lo tanto super no se puede usar en una subclase para llamar a un constructor diferente)
  2. Todos los demás constructores de la superclase todavía llaman al constructor por defecto internamente

El código:

Superclase:

 public abstract class SuperClass { // Variable all inner classes must set static int myVar = 0; public SuperClass() { myVar = giveValue(); } public abstract int giveValue(); } 

Subclase:

 public class SubClass extends SuperClass { @Override public int giveValue() { return 5; // individual value for the subclass } } 

En lugar de obligar a que las clases infantiles inicialicen los campos, puede seguir una estrategia de composición haciendo que el constructor de su clase adopte un parámetro que implemente una interfaz que proporcione los campos que desea inicializar.

  • Cómo mantener las cookies de sesión HTTP en HttpContext entre las actividades en Android?
  • Insertar datos en la base de datos - ¿Cuál es la mejor manera de hacerlo?
  • No se puede actualizar el widget android desde BroadcastReceiver
  • Casting un objeto java a objeto en Scala
  • La mejor manera de realizar la comunicación entre actividades en una aplicación Android TabHost
  • Servidor Java Firebase para enviar notificaciones push a todos los dispositivos
  • ¿cuál es el objeto T ?
  • ¿Por qué Java (Android?) Está estableciendo la fecha de la última modificación de mi archivo a mañana?
  • Dagger: la clase no podría estar enlazada con la clave
  • AuthenticatorException: error de enlace en AVD
  • ¿Cómo hago que mi ImageView tenga un tamaño fijo independientemente del tamaño del mapa de bits
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.