View Full Version : [JAVA] Dichiarare un metodo static
D4rkAng3l
03-02-2009, 16:25
Ciao...un piccolo dubbio...quand'è che bisogna dichiarare un metodo come static?
Una variabile la dichiaro static quando deve essere di classe ovvero che non è una variabile che identifica caratteristiche dei singoli oggetti ma una caratteristica di tutta la classe...che ne sò ad esempio ogni volta che creo un nuovo oggetto il costruttore incrementa una variabile di classe "conta" che mi tiene il conto di quanti oggetti sono stati creati....
Ma un metodo quand'è che ho necessità di dichiararlo come static?
Grazie
Andrea
yorkeiser
03-02-2009, 17:50
I casi/motivi possono essere vari, comunque in genere quando il metodo non agisce su una particolare istanza oppure non hai bisogno di/non vuoi creare un'istanza in/su cui chiamarlo.
Ad esempio, se stai scrivendo una classe di utility (ad esempio un banale contenitore generico di funzioni che operano delle trasformazioni su stringhe), in relazione al tipo di applicativo che scrivi puoi non avere il bisogno di istanziare la classe per chiamarne i metodi; ecco che in quel caso ti può tornare un metodo di tipo static, il cui contenuto è avulso dal contesto della singola istanza della classe.
agente mm8
03-02-2009, 18:18
In maniera più pratica, se il metodo do() non è statico (quindi deve usare delle variabili che si inizializzano con il costruttore, ecc.) si usa così:
BohClass bc = new BohClass(...);
bc.do();
Se è un metodo statico (quindi non deve usare variabili della classe) si usa così:
BohClass.do();
Un metodo do statico:
public class BohClass{
pubic static int do(int n){
int x = 3;
return x + n;
}
}
metodo do non statico:
public class BohClass{
int y = 5;
public int do(int n){
int x = 3;
return y + x + n;
}
}
banryu79
04-02-2009, 08:52
Un buon esempio di metodi statici li puoi trovare nella classe java.lang.Math (http://java.sun.com/javase/6/docs/api/java/lang/Math.html).
Se è un metodo statico (quindi non deve usare variabili della classe) si usa così:
Questa frase è un po' fuorviante, perchè può essere interpretata erroneamente in funzione del significato che si attribuisce a "variabile di classe".
In Java meglio parlare di membri di istanza e membri di classe.
In questo caso se un metodo è statico (metodo di classe) non può riferirsi a membri di istanza ma può riferirsi a membri di classe ;)
<rant>
Non sei mai obbligato a dichiare qualcosa 'static'...
static ed extends dovrebbero essere eliminati dal linguaggio...
</rant>
banryu79
04-02-2009, 09:59
<rant>
static ed extends dovrebbero essere eliminati dal linguaggio...
</rant>
Da quale linguaggio? Solo da Java?
Da quale linguaggio? Solo da Java?
Si si, parlavo solo di java. :)
banryu79
04-02-2009, 10:47
Si si, parlavo solo di java. :)
Non ho però capito perchè elimineresti anche extends...
Come implementi l'ereditarietà?
Non ho però capito perchè elimineresti anche extends...
Come implementi l'ereditarietà?
Beh, fare a meno di extends non vuol dire eliminare implements :)
Avrei dovuto essere più specifico e dire che vorrei eliminare extends per le classi e lasciarlo per le interfacce.
L'ereditarietà fra classi è causa di problemi spinosi tipo il 'fragile base class problem'.
http://www.cas.mcmaster.ca/~emil/publications/fragile/
http://en.wikipedia.org/wiki/Fragile_base_class
Item 17: Design and document for inheritance or else prohibit it (questo è un capitolo di Effective Java di Bloch)
Personalmente vado via implementando sempre da interfaccia, e il polimorfismo è salvo.
Poi oh, è sempre il mio gusto e basta... come sarebbe sempre solo il mio gusto avere i generics anche a runtime, il multiple dispatch (disaccoppiando la classe, che dovrebbe essere solo 'stato', dai metodi, com'è in common lisp, dylan, factor, clojure, e altri), le funzioni come first-class-objects.... e vabbè... avevo messo il tag <rant>, no? :)
banryu79
04-02-2009, 11:42
Poi oh, è sempre il mio gusto e basta... come sarebbe sempre solo il mio gusto avere i generics anche a runtime, il multiple dispatch (disaccoppiando la classe, che dovrebbe essere solo 'stato', dai metodi, com'è in common lisp, dylan, factor, clojure, e altri), le funzioni come first-class-objects.... e vabbè... avevo messo il tag <rant>, no? :)
Certo, i gusti non si discutono.
Invece sono contento di farti queste domande perchè di solito le tue risposte mi sono di stimolo per apprendere cose nuove o vedere cose non nuove da un nuovo punto di vista.
Grazie dei link, in pausa pranzo me li leggo.
^TiGeRShArK^
04-02-2009, 11:56
<rant>
Non sei mai obbligato a dichiare qualcosa 'static'...
static ed extends dovrebbero essere eliminati dal linguaggio...
</rant>
Per quanto riguarda nel preferire l'utilizzo della composizione e dell'implementazione di interfacce al posto dell'ereditarietà sono d'accordissimo.
Per quanto riguarda i metodi statici invece hanno anche la loro utilità, come nel caso del Factory pattern o di classi astratte di utility.
E il factory, quando non viene abusato, potrebbe anche essere una buona soluzione per determinati problemi.
P.S. ecco un divertentissimo esempio (grazie fek :flower: ) che spiega perchè NON si deve abusare assolutamente del Factory pattern:
http://discuss.joelonsoftware.com/default.asp?joel.3.219431.12
:asd:
LOL! Quel link me l'ero perso! Troppo spassoso! :)
D4rkAng3l
04-02-2009, 17:24
doh seconda parte scritta dell'esame (quella su Java fatta oggi)....era tosto...pregate per me che se mi boccia o mi abbassa molto il voto rosico perchè al primo dei due scritti (quello teorico) avevo preso 28...ma su questo sono molto più titubante circa i miei risultati...più che altro spero riesa anche a capire la mia scrittura che è tra il cuneiforme ed il gereoglifico...:muro: :muro: :muro: :muro:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.