(Utilizzo della terminologia Java): i metodi statici possono essere associati ai membri statici (membri dell'oggetto class
). Se i metodi non accedono ai membri statici (né alle risorse IO o a qualsiasi altro elemento che potrebbe cambiare stato), se tali membri sono% primitive% co_de o oggetti immutabili (essenzialmente costanti), allora tali metodi statici potrebbero essere chiamati funzioni, ma in in generale, perché potenzialmente potrebbero accedere ai membri dell'oggetto final
, in genere vengono chiamati metodi statici .
Per poter contare come una funzione, un metodo deve essere indipendente da qualsiasi stato ; non deve causare alcun effetto collaterale né essere influenzato da alcun effetto collaterale. Quando viene chiamato con parametri specifici, deve sempre restituire lo stesso risultato. Altrimenti non è una funzione pura.
Cioè, il seguente class
è una funzione:
class MyClass {
static final double pi = 3.14;
static double area(double r) {
return pi * r * r;
}
}
mentre il seguente area
non è una funzione:
class MyClass {
static int callCount = 0;
static int getCallCount {
return ++callCount;
}
}
In generale, i membri statici mutabili (non- getCallCount
) dovrebbero essere usati con cautela - qualcuno direbbe che non dovrebbero essere usati affatto - perché fanno uno stato globale al programma , che probabilmente si rivelerà una pessima scelta progettuale a lungo termine. Ci sono delle eccezioni, ma fai attenzione ...
Non hai nemmeno bisogno di membri statici per rendere non-statiche : final
non è sicuramente una funzione pura (perché restituisce un valore diverso nelle chiamate successive), anche se accede solo l'orologio del computer, non tutti i membri statici.
In modo abbastanza confuso, potresti anche eseguire funzioni pure non statiche :
class MyClass {
final double pi = 3.14;
double area(double r) {
return pi * r * r;
}
}
Ora, anche se non più System.nanoTime()
, static
è ancora una funzione pura: non tocca nulla che possa cambiare. Il fatto che tu debba creare un'istanza di area
per accedere a MyClass
non riduce la sua "funzionalità". In effetti, si potrebbe sostenere che questo tipo di funzioni pure dovrebbe sempre essere statico.