Digamos que tengo 3 clases A, B, C, y mi principal. B se extiende A. Quiero usar un escáner en todos ellos incluyen mi principal. debería mover el escáner por herencia o debo usar estática y declarar mi escáner en mi principal?
Traté de mirar aquí, pero no conseguir una respuesta clara cuál es mejor: ¿Hay alguna manera de poder utilizar un objeto escáner en una clase diferente?
public class Main {
public static Scanner staticScanner = new Scanner (System.in);
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
A a = new A(sc);
C c = new C();
c.cDoSomething(sc);
sc.close();
}
public class A {
private Scanner sc;
public A (Scanner sc){
this.sc = sc;
}
public void aDoSomething(){
B b = new B();
b.bDoSomething(sc);
}
public class B extends A {
public void bDoSomething(Scanner sc){
}
public class C {
public void cDoSomething(Scanner sc){
}
Como he dicho anteriormente me gustaría entender qué método es el mejor y es la correcta para su uso. staticScanner y lo llaman por mi clase principal o mover el escáner SC entre las clases, según sea necesario
Creo que la respuesta aquí puede depender de algunos de los aspectos específicos de las clases y la situación subyacente, particularmente en lo que respecta a la forma acoplada el estado del escáner puede estar en el estado de otras variables en las clases y el número de métodos o invocaciones separadas a nivel .
En general, sin embargo, yo personalmente prefiero c.doSomething(sc);
si no hay un estado interno que se mantiene en la clase C entre invocaciones de métodos. Es decir, que no tenemos c.doSomething1(sc)
y c.doSomething2(sc)
que necesitan ser llamados en el orden contra el mismo escáner debido al estado interno está modificando en C
.
El argumento contrario es si estamos haciendo lo que es efectivamente un contenedor (o alguna forma de decorador) alrededor del escáner que tiene sentido perfecto para pasar el escáner a la clase en el constructor y mantener una referencia a la misma. Es decir, si queremos tener algo como:
MyReader reader = new MyReader(scanner);
MyObject myObject = reader.readNextMyObject();
Sin embargo, creo que sería muy confuso si estábamos leyendo desde el mismo escáner a través de múltiples envolturas intercaladas en el código:
// I think the below would be UGLY, at least imho.
MyReaderA readerA = new MyReaderA(scanner);
MyReaderB readerB = new MyReaderB(scanner);
MyObjectX obj1 = readerA.readMyObject();
MyObjectY obj2 = readerB.readMyObject();
Creo que sería confuso que dos lectores diferentes están operando en el mismo escáner y moviendo su índice.