2015-03-28 13 views
5

Ho un programma che utilizza più classi, voglio che le altre classi siano in grado di accedere allo stesso scanner che ho dichiarato nella classe principale, presumo che sarebbe fatto usando una sorta di metodo get, tuttavia non sono in grado di trovare risorse per aiutarmi.Come utilizzare lo stesso scanner su più classi in Java

Qui ci sono gli scanner che ho fatto nella mia classe principale:

Scanner in = new Scanner(System.in); 
      System.out.println("Enter a filename"); 
      String filename = in.nextLine(); 
      File InputFile = new File (filename); 
      Scanner reader = new Scanner(filename); 

Lo scanner lettore è quello che voglio essere in grado di accedere attraverso le altre classi che compongono il programma, qualcuno può dare qualche consiglio su come posso fare questo? Grazie mille per qualsiasi aiuto!

+0

Questo sembrerebbe essere alquanto fragile come un altro 'class' potrebbe' close() 'lo' Scanner' e rompere tutto - no? Forse dovresti leggere il file in memoria? O è molto grande? –

+0

una opzione sarebbe dichiarare il lettore come un campo statico nella classe principale –

+0

un'altra opzione sarebbe quella di iniettare il lettore in altri oggetti creati dalla classe principale (supponendo che la classe principale sia responsabile di tutti i collegamenti) –

risposta

2

Utilizzare semplicemente public static final Scanner in = new Scanner(System.in); nella classe main. Dopodiché puoi chiamarlo da qualsiasi luogo tramite MainClassName.in.

Inoltre, fare attenzione con gli argomenti passati a Scanner. Credo che si voleva mettere in InputFileScanner, piuttosto che filename =)

File InputFile = new File (filename); 
Scanner reader = new Scanner(filename); 
+0

Quindi basta fare questo con lo Scanner che ho già definito, cioè il "lettore"? – Samolivercz

+1

Sì. Puoi dichiarare il tuo campo locale 'Scanner scanner statico pubblico' in' MainClass', inizializzarlo dal tuo codice e usarlo da qualsiasi luogo. Ma fai attenzione a chiudere queste risorse. – ar4ers

+0

Non riesco a chiamare lo Scanner in un'altra classe usando il modo in cui mi hai suggerito, sto ricevendo un errore: "non una dichiarazione" – Samolivercz

0

Ci sono i cosiddetti design patterns che ti aiutano ad affrontare tali questioni quotidiane. Mostrano le migliori pratiche.

Si sta cercando qualcosa come una Singleton, un'istanza di una classe che è univoca per il proprio ecosistema software.

Per esempio, si può fare qualcosa di simile:

public class MyScanner{ 
    private static MyScanner instance = new MyScanner(); 
    private MyScanner(){ 
     // init the scanner 
    } 

    //Get the only object available 
    public static MyScanner getInstance(){ 
     return instance; 
    } 

    public void read(File f){ 
     // read your file 
    } 
} 
0

rispondere alla tua domanda circa l'iniezione di dipendenza: ecco una vaga idea di dependency injection (via costruttore):

public void wire() { 
    ... 
    Scanner reader = new Scanner(filename); 
    ClassA objectA = new ClassA(reader); 
    ClassB objectB = new ClassB(reader); 
    ... 
} 

classe A (la classe B avrebbe un costruttore simile):

public class ClassA { 

    private Scanner reader; 

    public ClassA(Scanner reader) { 
     this.reader = reader; 
    } 
    ... 
} 

Quindi l'idea è che si creano e si cablano gli oggetti nel metodo wire().