E 'una buona idea avere un metodo che inizi con get senza essere un accessor?

1

Supponiamo che tu abbia implementato un'interfaccia come:

public interface Example {
  InputStream getThatContent();
}

In questo caso non c'è alcuna proprietà e l'implementazione potrebbe anche avere effetti collaterali (può aprire un nuovo InputStream).

Ciò accade anche in altre API, come JDBC:

public static Connection getConnection(String url,
                       String user,
                       String password)
                                throws SQLException

Il metodo inizia con get, e in realtà crea una nuova connessione, quindi mi chiedo, la convenzione di denominazione del metodo getter / setter è valida solo nelle classi POJO? O in tutte le classi Java?

    
posta thermz 24.08.2016 - 16:58
fonte

3 risposte

2

La convenzione popolare e accettata nella comunità Java su come assegnare i getter (1):

  • Quando vuoi esporre membri privati e rispettare l'incapsulamento non devi rendere pubblici i suddetti membri, ma invece scrivere setter e getter e questi setter devono essere chiamati setX(Type value) e i gettet devono essere denominati Type getX() .

Questo è tutto.

  • La convenzione non proibisce ai non-getters di iniziare con il prefisso "get".
  • Un metodo come getFullName() potrebbe restituire firstName+" "+LastName . Nota che nessuna variabile di classe chiamata fullName fa parte dello stato.
  • La convenzione non stabilisce che i metodi che iniziano con il prefisso "get" non debbano avere effetti collaterali. Ad esempio, potrei scrivere su un file di log all'interno di un getter.

Chiarire cos'è un POJO e cosa no:

Una classe che usa java.util.Collection continua ad essere un POJO perché java.util.Collection fa parte di JSE. Una classe non è un POJO quando usa JEE o qualche framework o annotazione esterna.

(1) Significato getter un metodo che restituisce il valore di un membro privato di una classe.

  • È una buona idea avere un metodo come getFullName() quando la classe non ha fullName membro?

IMO lo è. Inoltre, in che modo il consumatore di una classe compilata che ha un metodo getFullName() sa se la classe ha o meno un membro chiamato fullName ?

    
risposta data 24.08.2016 - 19:29
fonte
2

Quando vedo il prefisso get, intendo che indica lo stato esposto finché il codice non si dimostra diversamente. Dove lo stato è nuovo o vecchio non mi riguarda.

Se mi stai costruendo qualcosa che è mio, possedere, chiudere, ecc. allora il nome che mi aspetto è thingBuilder.

È impossibile dirti quale è corretta se non mi dici chi è il proprietario del flusso di input. Sto dicendo che se il chiamante è destinato a possederlo, usa il costruttore.

Altrimenti usa get per mostrare che sei proprietario di questo stato esposto. Questo ti rende un oggetto di valore. Non usare get se non è quello che sei.

    
risposta data 24.08.2016 - 18:46
fonte
0

È una buona idea quando l'uso esterno è simile a un getter. Vengono in mente due forme primarie.

Se le informazioni che vengono fornite sono renderizzate e non memorizzate

Class Rectangle
    {

int height = 3;
    int length = 4;



    getArea(){
        return height * length;
    }

    getPerimeter(){
        return 2 * ( height + length );
    }
}

Se il metodo restituisce un nuovo oggetto da una classe factory

Nota: Apparentemente la numerazione di un elenco interrompe il modo in cui la formattazione del codice funziona

    
risposta data 26.08.2016 - 18:34
fonte

Leggi altre domande sui tag