Java: utilizzando la parola chiave final solo sui parametri del metodo che si aspettano oggetti immutabili? [chiuso]

4

Mi sono imbattuto nell'interessante argomento sui parametri del metodo finale e in sostanza non offrono molti vantaggi. Mi chiedevo se sarebbe sensato contrassegnare solo quei parametri del metodo come finali, quando è consigliabile passare un oggetto immutabile.

Non so se questo potrebbe fuorviare alcune persone mentre stanno leggendo il codice, perché la finale non fornisce questa immutabilità, e anche il compilatore non capirebbe che mi piacerebbe che un oggetto immutabile venisse passato a questo metodo param. Ma sarebbe come un indicatore "leggibile" (specialmente nelle API) che si consiglia di passare un oggetto immutabile.

In che modo un tale concetto dovrebbe essere valutato dai programmatori java esperti?

    
posta Unknown Id 01.07.2015 - 13:11
fonte

2 risposte

4

Personalmente, usavo sempre final sempre (di questi tempi, di volta in volta) solo per garantire che le variabili non venissero riassegnate; niente di più, niente di meno.

Il vantaggio di non riassegnare le variabili è importante per me in realtà, poiché scoraggia la "stampella" delle variabili temporanee. Questo a sua volta mi incoraggia a riesaminare il mio codice per codice ripetitivo (sostituendoli con metodi in linea, o anche a ri-strutturarli) ed elimina potenziali bug dovuti a ritardi incauti.

Quest'ultimo è più utile nei metodi long do-it-all, ma una volta scomposto in metodi più piccoli, è più facile vedere l'ambito delle variabili e quindi anche meno probabilità di riassegnarle in primo luogo. Quindi la mia preferenza personale per usarli di meno ora.

Per affrontare la tua preoccupazione sull'accettazione di oggetti mutevoli / immutabili, il mio suggerimento è di renderne uno l'approccio predefinito per la tua libreria / base di codice, attenersi a quello e quindi documentare l'eccezione. In altre parole, se per impostazione predefinita è meglio passare oggetti immutabili, è possibile renderlo chiaro così dal tipo di documentazione "Per iniziare" per risolvere questo codebase-wide. Puoi quindi utilizzare il suggerimento di @ assylias per documentare i metodi per dire qualcosa del tipo:

/**
 *  This method works with mutable arguments as well.
 */

o

/**
 *  The side-effect of this method modifies the mutable arguments.
 */

Puoi anche giocare con il nome della tua classe chiamandoli MyImmutableType (ad esempio). Generalmente lo evito perché i loro nomi non "rotolano bene", ma YMMV.

// this has to return a new MyImmutableType instance
public MyImmutableType doSomething(MyImmutableType input);

// this possibly mutates the mutable argument, which the caller will then use
public void doSomething(MyMutableType input);

Forse ancora più importante , final anche le tue classi di argomenti in modo che se i chiamanti / utenti della tua base di codice decidono di controllare il tuo codice sorgente, allora possono anche dire immediatamente che la classe è immutabile.

public final class Wrapper<T> {
    private final int id;
    private final T payload;

    public Wrapper(int id, T payload) {
        this.id = id;
        this.payload = payload;
    }
}

In conclusione , se vedo una parola chiave final nella firma del metodo, tutto quello che so è che lo sviluppatore sta facendo qualcosa giusto non (potenzialmente) riassegnando argomenti del metodo all'interno del metodo. Non dovrebbe essere invocato per indicare se gli argomenti dovrebbero / devono essere immutabili.

    
risposta data 02.07.2015 - 03:05
fonte
1

Non penso sia una buona idea:

  • utilizzando final per un parametro di metodo, come hai notato, non fornisce alcuna garanzia di immutabilità
  • Personalmente trovo che ingombra il codice inutilmente
  • Le persone che utilizzano il tuo codice non dovrebbero leggere il tuo codice! final non fa parte del contratto del metodo / suo javadoc quindi non è il mezzo giusto per trasmettere informazioni ai chiamanti.

Vorrei piuttosto indicare nella javadoc le ipotesi formulate dal metodo:

/**
 *  This method expects its argument to be immutable
 */

ps: non sono sicuro perché vuoi ricevere un oggetto immutabile anche se non fa alcuna differenza per il codice nel tuo metodo (a meno che non crei nuovi thread ecc.) ...

    
risposta data 01.07.2015 - 14:17
fonte

Leggi altre domande sui tag