Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [JAVA] Metodo Static o non static??

    Salve a tutti stò facendo un programma che mi riordina un vettore inserito da me tramite le finestre grafiche di swing e per riordinarlo ho creato la classe BubbSort che possiede al suo interno due metodi (crescente e decrescente), la domanda che volevo porvi è la seguente:
    Quale dei due è migliore (static o non static)??? perchè dovrei utilizzare una e non l'altra?? dov'è la convenienza??? Vi pongo i due casi:

    1)Ho utilizzato in un primo caso il metodo non statico per entrambi i metodi e quindi nel main ho instanziato l'oggetto con il costruttore
    codice:
    BubbSort c = new BubbSort
    e l'ho poi richiamato quando mi serviva con:

    codice:
    c.crescente(temp,vettore,numElem)
    2)Nel secondo caso ho dichiarato i metodi static e quindi non ho instanziato nulla nel main e ho solo richiamato i metodi quando mi servivano con il seguente codice:

    codice:
    BubbSort.crescente(temp,vettore,numElem)
    Ora aspetto una vostra, per chiarirmi un pò le idee a riguardo...grazie...

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Metodo Static o non static??

    Originariamente inviato da ldateam
    ho creato la classe BubbSort che possiede al suo interno due metodi (crescente e decrescente), la domanda che volevo porvi è la seguente:
    Quale dei due è migliore (static o non static)???
    La domanda che devi farti è la seguente: questa tua classe BubbSort ha dello "stato" (= variabili di istanza) che deve essere accessibile dai metodi?

    Se la tua classe non ha variabili di istanza e quei due metodi sono solo di "utility" che operano solo sui parametri passati, allora:
    a) I metodi dovrebbero essere static
    b) Dovresti impedire la possibilità di istanziare la classe (= mettere solo 1 costruttore private)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Mhm...la mia classe ha delle variabili definite in essa, però sono le variabili che ho già dichiarato nel programma principale e ho dovuto ridichiararle nella classe per poterle utilizzare nei metodi...i metodi non utilizzano altre variabili oltra a quelle che gli passo dal programma principale...si capisce ciò che voglio dire??


    Che vuol dire solo di "utility"??
    Che vuol dire dovresti impedire la possibilità di istanziare la classe mettendo un solo costruttore private???...mi potresti chiarire anche questo concetto?? grazie..come sempre gentilissimi..;-)

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da ldateam
    Mhm...la mia classe ha delle variabili definite in essa, però sono le variabili che ho già dichiarato nel programma principale e ho dovuto ridichiararle nella classe per poterle utilizzare nei metodi...i metodi non utilizzano altre variabili oltra a quelle che gli passo dal programma principale...si capisce ciò che voglio dire??
    Per chi ha visto quelle classi sì.
    Le variabili che vengono usate dai metodi di quella classe possono tranquillamente essere dichiarate e usate all'interno dei metodi... non servono a definire lo "stato" di quella classe, sono solo variabili di comodo da usare per le elaborazioni.

    Che vuol dire solo di "utility"??
    Esattamente ciò che sono i tuoi metodi: non devono lavorare sullo stato dell'oggetto BubbSort, ma sono solo dei metodi che forniscono un'utilità per l'array che gli viene passato... non hanno bisogno di altre strutture dati o di avere memoria dello stato di niente.

    Che vuol dire dovresti impedire la possibilità di istanziare la classe mettendo un solo costruttore private???...mi potresti chiarire anche questo concetto?? grazie..come sempre gentilissimi..;-)
    Classi come quella che hai realizzato non hanno senso di essere istanziate. Non ha senso avere dieci diverse istanze della classe BubbSort: i suoi metodi devono solo lavorare su un generico array e devono fare sempre lo stesso lavoro... il lavoro di una classe Utility.
    Quello che andbin diceva è che per fare in modo che non si possa istanziare una classe di utility (perchè non ha senso) è possibile dotare questa classe di un costruttore privato (con modificatore di accesso private). Ma questi concetti, ripeto, li dovresti lasciare per ultimi, visto che a te non è ancora chiaro cosa sia la programmazione Object Oriented. Studia prima i concetti di tale tipo di programmazione e poi progredisci con gli altri concetti.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Grazie sempre per la pazienza LeleFT...quindi da come ho capito e onestamente immaginavo anche io quelle variabili è come se le avessi dichiarate all'interno dei singoli metodi in quanto non hanno influenza sulla classe (ma mi conviene dichiararle lì per evitare di dichiararle in ogni singolo metodo) e pertanto non sono variabili di istanza della classe...quindi in definitiva mi conviene in tal caso definire i metodi static e utilizzare la seconda procedura che ho scritto sopra??

    Per quanto riguarda il private (premetto che qualcosa della programmazione OO la conosco, solo che faccio domande che possono sembrare stupide anche per avere una conferma di ciò che penso) giustamente mi suggerisci di rendere la mia classe BubbSort non pubblica ma privata in tal modo in nessun altro programma può essere modificata ma può essere solo richiamata per utilizzarne i suoi metodi...giusto??...ma questo implica qualcosa sulla definizione dei metodi static o non static?? (questa è una cosa che non conosco per nulla )

    GRAZIEEEEEE!!!!!

  6. #6
    Non è che rendi la tua classe privata. Introducendo un costruttore tuo personalizzato, il costruttore di default che verrebbe creato dalla JVM non viene creato. Pertanto la semplice scrittura di un costruttore del tipo

    Codice PHP:
    private TuaClasse(){


    impedisce alla JVM di creare il costruttore di default privo di parametri. Per questo motivo non potrai più istanziare la tua classe con una cosa del genere:

    Codice PHP:
    TuaClasse nome  = new TuaClasse(); 
    I tuoi metodi statici restano inalterati.
    Al mio segnale... scatenate l'inferno!

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da ldateam
    giustamente mi suggerisci di rendere la mia classe BubbSort non pubblica ma privata in tal modo in nessun altro programma può essere modificata ma può essere solo richiamata per utilizzarne i suoi metodi...giusto??...ma questo implica qualcosa sulla definizione dei metodi static o non static?? (questa è una cosa che non conosco per nulla )
    Rendere una classe privata non significa "impedire agli altri programmi di modificarla"... nessun programma può modificare una classe. Sarebbe disastroso!

    I programmi possono, semmai, usare delle istanze di una determinata classe o usarne i metodi statici.

    Rendendo privato il costruttore di default di una classe (come ti ha illustrato R@ve M@ster), semplicemente impedisci a chiunque di poter istanziare quella classe. Non impedisci a nessuno, invece, di usarne normalmente i metodi statici.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Ragazzi vi ringrazio sempre per l'aiuto anche perchè dalle vostre parole capisco i punti su cui andare a chiarire i concetti che non mi sono chiari...allora leggendo a riguardo della dichiarazione di private ho tratto delle mie conclusioni e vorrei capire se sono giuste....

    Posso scegliere due strade...

    1) la prima creo due file differenti: ordina.java e bubbsort.java il primo è il programma principale in cui inserisco, quando mi servono, le chiamate ai metodi nel seguente modo:
    codice:
    bubbsort.crescente(temp,vettore,numElem)
    e il secondo è la mia classe che contiene solo i metodi crescente e decrescente :
    codice:
    public static void crescente(temp,vettore,numElem)
    2)la seconda, creo un solo file ordina.java e all'interno inserisco prima il main in cui richiamo, quando mi servono i metodi nel seguente modo :
    codice:
     crescente(temp,vettore,numElem)
    e poi inserisco i miei due metodi nel seguente modo:
    codice:
     private static void crescente(temp,vettore,numElem)
    giusto???...se ho sbagliato qualcosa vi prego di avere pazienza come sempre fino ad ora...ora la mia domanda è:
    Quale delle due strade mi conviene seguire???...cosa le differenzia di così sostanziale??perchè scegliere una e non l'altra???....grazie ancora...;-)

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ldateam
    1) la prima creo due file differenti: ordina.java e bubbsort.java
    2)la seconda, creo un solo file ordina.java
    È poi solo una questione "strutturale" e pratica. Per progetti veri ... "reali" e di un certo livello è preferibile scrivere 1 file sorgente per ogni singola classe/interfaccia principale (anche per un motivo dovuto al livello di accesso delle classi).

    Nel tuo caso, cioè un piccolo programmino di test e "didattico" sugli array ..... beh, non è così importante e fondamentale. Insomma .... è abbastanza indifferente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Vabbè a livello pratico ho capito che qualsiasi delle due strade seguo essendo il mio un progettino banale e didattico va bene, anche se si preferisce in generale la prima strada...invece a livello teorico dove posso approfondire bene bene queste tematiche?? cioè dove posso capire bene la differenza tra public, public static e private?? ho provato su qualche manuale free quale java mattone dopo mattone e quello sul sito ma non è che ci ho capito molto...grazie...;-)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.