Metodo immutabile in Java

3

In Java, c'è la parola chiave final al posto della parola chiave const in C e C ++.

Nelle ultime lingue ci sono metodi mutevoli e immutabili come indicato in la risposta di Johannes Schaub - litb al domanda Quanti e quali sono gli usi di " const "in C ++?

Use const to tell others methods won't change the logical state of this object.

struct SmartPtr {
    int getCopies() const { return mCopiesMade; }
}ptr1;

...

int var = ptr.getCopies(); // returns mCopiesMade and is specified that to not modify objects state.

Come viene eseguito in Java?

    
posta Chris Okyen 12.11.2012 - 02:14
fonte

4 risposte

6

Non puoi. Non ho familiarità con Java 7, ma almeno in Java 6 non si può dire al compilatore che un metodo non dovrebbe mutare i suoi argomenti o l'istanza this .

Sfortunatamente final in Java non equivale a const in C ++.

Un argomento final significa qualcos'altro: solo che non puoi riassegnarlo, così che il seguente è un errore:

A method(final B arg) {
    ...
    arg = something;  // error, since arg is final
    ...
}

Questa è una buona pratica, ma non ti impedirà di mutare arg chiamando uno dei suoi metodi.

Un metodo final come final A method(...) è correlato alle regole di sottoclasse e non alla mutazione.

    
risposta data 12.11.2012 - 02:40
fonte
5

Il final di Java non sostituisce il const di C. In Java final può apparire in cinque punti. Attributo, dichiarazioni di parametri formali e variabili e definizioni di classi e metodi. Se si utilizza final per attributi, variabili o parametri, non è possibile riassegnarli, quindi il compilatore non accetta quanto segue:

final List<String> xs = new ArrayList<>();
xs = new LinkedList<>(); //illegal

Tuttavia, tieni presente che puoi ancora modificare l'oggetto a cui fa riferimento xs :

final List<String> xs = new ArrayList<>();
xs.add("Hello World");

Come per le classi, final vieta di ereditare da questa classe. Quindi, anche questo è illegale:

final class A {
}

class B extends A { //illegal
}

E per i metodi final vieta l'override del metodo in una sottoclasse, quindi quanto segue è illegale.

class A {
    final void m() {}
}

class B extends A {
    final void m() { System.exit(1); } //illegal
}

Quindi perché qualcuno dovrebbe usare una parola chiave per tre diverse intenzioni? Bene, sono collegati. Se dai un'occhiata a java.lang.String vedrai che è dichiarato come final . E poiché non ci sono operazioni in String che cambieranno il valore dell'istanza puoi tranquillamente supporre che

final String GREETING = "Hello, World!";

definisce una costante.

BTW, const è anche una parola riservata in Java. Ma non ha semantica e quindi non può essere utilizzata in nessun programma Java.

    
risposta data 12.11.2012 - 08:58
fonte
2

L'unico modo per rendere immutabile un oggetto Java è all'interno della classe di quell'oggetto stesso e non da altre classi di chiamata.

Potresti avere puntatore costante (riferimento finale con il nome ufficiale Java) che significa che non puoi modificare il riferimento per puntare a un altro oggetto; non puoi avere puntatore a costante , il che significa che non puoi modificare l'oggetto di riferimento, come potresti avere in C / C ++.

    
risposta data 12.11.2012 - 08:34
fonte
1

L'unico modo per creare un metodo const in Java è creare un'interfaccia const per l'oggetto. Come:

interface ConstSomething {
    int getCopies();
}
class Something implements ConstSomething {
    int getCopies() { return mCopiesMade; }
}

Sì, a differenza del C ++ const questo influisce sulle prestazioni, perché ora il metodo deve essere chiamato virtualmente.

Nota che lo stesso vale per C #.

    
risposta data 12.11.2012 - 08:51
fonte

Leggi altre domande sui tag