Metodi statici

di il
2 risposte

Metodi statici

Ciao a tutti,
sto iniziando a studiare Java e mi trovo questo problema: nella classe principale "Rubrica", più precisamente nel main, dichiaro un arraylist di oggetti "Persona" di nome "rub", sul quale voglio fare le solite operazioni (inserimento, cancellazione, ecc.).
Le operazioni le voglio fare in metodi diversi dal main, perciò dichiaro questi metodi (nella stessa classe) utilizzando la keyword static (perché vengono richiamati dal main che è un metodo static...giusto??). E qui nasce il problema: essendo l'arraylist dichiarato nel main non è visibile negli altri metodi! Come risolverlo? Ho provato a dichiararlo fuori dal main (come l'oggetto Scanner) ma non funziona lo stesso...ho pensato che forse sarebbe meglio dichiarare l'arraylist in un'altra classe, o forse non cambierebbe nulla? Infine mi è venuto in mente di passare l'arraylist come parametro ai metodi statici...non so, sono un po' confuso, cosa mi consigliate di fare?

Posto qui sotto il codice, grazie dell'aiuto.

Classe Rubrica:

package rubrica;

import java.util.ArrayList;
import java.util.Scanner;

public class Rubrica {
    static Scanner tastiera = new Scanner(System.in);
    	
	// MAIN
    public static void main(String[] args) {
        
	// DICHIARO UN ARRAY DINAMICO       
        ArrayList<Persona> rub = new ArrayList<>();
        
        // VISUALIZZO MENU E FACCIO SCEGLIERE UN'OPERAZIONE
        int scelta = visualizzaMenu();    
       
        // ESEGUO L'OPERAZIONE RICHIESTA
        switch(scelta) {
            case 1: inserimento();
                    break;
            case 2: ricerca();
                    break;
            case 3: cancella();
                    break;
            case 4: modifica();
                    break;
            case 5: System.out.println("*** Fine programma ***");       
        }
    }   // FINE MAIN
    
	// ************************************************************ //
	
    // ALTRI METODI
    static int visualizzaMenu() {
        int s = 0;
        
	do{
            System.out.println("MENU':\n");
            System.out.println("--------------------------");
            System.out.println("1: inserimento*\n" +
                               "2: ricerca*\n" +
                               "3: cancella*\n" +
                               "4: modifica*\n" +
                               "5: esci dal programma");
            System.out.println("--------------------------");
            System.out.print("Scegli operazione: ");
            s = tastiera.nextInt();
        } while(s > 5);
        
	return s;
    }

    static void inserimento(){
        Persona p = new Persona();
        
        System.out.println("Inserisci nuovo utente.");
	System.out.println("Nome: ");
        p.setNome(tastiera.nextLine());
        System.out.println("Cognome: ");
	p.setCognome(tastiera.nextLine());
	System.out.println("Cellulare: ");
	p.setCellulare(tastiera.nextLine());
	rub.add(p);
    }
    
    ///////////////////////////////// DA FARE /////////////////////////////////
    static void cancella(){}
    
    static void modifica(){}
    
    static void ricerca(){}
    ///////////////////////////////////////////////////////////////////////////
    
}   // FINE CLASSE
Classe Persona:

package rubrica;

public class Persona {
    
    // ATTRIBUTI
    private String nome;
    private String cognome;
    private String cellulare;
    
    // COSTRUTTORI
    public Persona(String nom, String cog, String cel) {
        nome = nom;
        cognome = cog;
        cellulare = cel;
    }
    
    public Persona() {}

    // GETTER e SETTER
    public String getNome() { return nome; }
    public void setNome(String nom) { nome = nome; }
    public String getCognome() { return cognome; }
    public void setCognome(String cog) { cognome = cognome; }
    public String getCellulare() { return cellulare; }
    public void setCellulare(String cel) { cellulare = cel; }
	
	// METODI
    void mostra() { System.out.println(nome + " " + cognome + " " + cellulare);  } 
}

2 Risposte

  • Re: Metodi statici

    mauronew ha scritto:


    Le operazioni le voglio fare in metodi diversi dal main, perciò dichiaro questi metodi (nella stessa classe) utilizzando la keyword static (perché vengono richiamati dal main che è un metodo static...giusto??).
    Sì giusto, tecnicamente. Ma non è l'unico approccio avere tutto "statico". L'altro approccio è ragionare più "ad oggetti" ma qui non so quanto hai già appreso a riguardo. In sostanza un'altra possibilità è creare una istanza di Rubrica, tenere all'interno dell'oggetto Rubrica il ArrayList e definire quindi gli altri metodi "di istanza", invece che static.

    mauronew ha scritto:


    E qui nasce il problema: essendo l'arraylist dichiarato nel main non è visibile negli altri metodi!
    Se è "locale", no appunto.

    mauronew ha scritto:


    Ho provato a dichiararlo fuori dal main (come l'oggetto Scanner) ma non funziona lo stesso...
    Certo che funziona.
    public class Rubrica {
        static Scanner tastiera = new Scanner(System.in);
        static ArrayList<Persona> rub = new ArrayList<>();

    mauronew ha scritto:


    ho pensato che forse sarebbe meglio dichiarare l'arraylist in un'altra classe, o forse non cambierebbe nulla?
    Qui torniamo alla prima risposta sopra, ovvero cambiare design.

    mauronew ha scritto:


    Infine mi è venuto in mente di passare l'arraylist come parametro ai metodi statici...
    Pessima idea dal punto di vista del "design" generale.

    mauronew ha scritto:


    
        public String getNome() { return nome; }
        public void setNome(String nom) { nome = nome; }
        public String getCognome() { return cognome; }
        public void setCognome(String cog) { cognome = cognome; }
        public String getCellulare() { return cellulare; }
        public void setCellulare(String cel) { cellulare = cel; }
    
    Attenzione che alcuni sono sbagliati. Non "inventare" un nome diverso per il parametro. In Java c'è una convenzione ben nota ed assodata. Se c'è un campo:

    private String cognome;

    i getter/setter si scrivono così:
    public String getCognome() {
        return cognome;
    }
    
    public void setCognome(String cognome) {      // parametro con stesso nome del campo!
        this.cognome = cognome;          // si usa this per qualificare il campo!
    }
  • Re: Metodi statici

    Ho provato a dichiararlo fuori dal main (come l'oggetto Scanner) ma non funziona lo stesso...
    Certo che funziona.
    si è vero, funziona. lo avevo provato ma c'era un problema, probabilmente era di un altro tipo, non ricordo
    ho pensato che forse sarebbe meglio dichiarare l'arraylist in un'altra classe, o forse non cambierebbe nulla?
    Qui torniamo alla prima risposta sopra, ovvero cambiare design.
    ok
    Non "inventare" un nome diverso per il parametro
    hai ragione, se mantengo lo stesso nome non devo ricordarmi ogni volta (o creare una mia regola personale) come li ho chiamati.

    grazie di tutte le risposte che mi hai dato, mi sono state utili
    ciao
Devi accedere o registrarti per scrivere nel forum
2 risposte