Metodi statici o funzioni statiche?

6

Stavo leggendo link e tutto ad un tratto, la cosa mi è venuta in mente erano i metodi statici.

Poiché i metodi statici non sono in alcun modo associati a un oggetto, come possono essere definiti come metodi statici (quasi tutti gli sviluppatori lo fanno)? La mia comprensione dei metodi / funzioni è corretta?

    
posta Gopi 22.11.2010 - 09:53
fonte

3 risposte

10

(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.

    
risposta data 25.11.2010 - 07:58
fonte
4

As static methods are no way associated with an object how can it be called as static methods (almost all developers do)? Is my understanding about the methods/functions is correct?

È un abuso di linguaggio. In C ++:

  • una funzione membro è una funzione associata a un tipo o istanze di un tipo. Può essere:
    • statico : associato al tipo stesso, non alle istanze
    • non-static : associato a un'istanza del tipo. Possono essere:
    • virtuale : può essere ridefinito da una classe figlia del tipo
    • non-virtuale : non può essere ridefinito da una classe figlia (ma può essere "nascosto", spesso attivando un avviso di compilazione)
  • un metodo è una funzione membro virtuale che non può essere statica per definizione

Il problema è che alcuni linguaggi post-C ++ come Java, tutte le funzioni membro (non statiche) sono virtuali. Quindi la gente ha iniziato a dire che quelli sono metodi. Poiché non avevano bisogno di funzioni membro non virtuali, utilizzavano il solo metodo word per qualsiasi funzione membro di una classe. Ora, in quei linguaggi, i tipi sono anche oggetti, sono un'istanza, quindi puoi dire che i loro membri statici sono in effetti metodi dell'oggetto unico che rappresenta il tipo. (Non sono sicuro che sia corretto per qualsiasi lingua dinamica)

Ad ogni modo, dal tuo punto di vista, le funzioni dei membri statici (o il metodo se preferisci) dovrebbero sempre essere percepiti come indipendenti dagli oggetti del tipo di cui sono membri, ma implicitamente associati al tipo stesso (qualunque sia l'implementazione di quel significato è - qualunque sia la lingua).

    
risposta data 22.11.2010 - 13:44
fonte
0

Sono d'accordo con te. Di solito li chiamo procedure, poiché non sono né i metodi (associati ad un oggetto dinamico), né le funzioni (senza effetti collaterali).

    
risposta data 24.11.2010 - 02:39
fonte

Leggi altre domande sui tag