Entra

View Full Version : [JAVA] Correttezza implementativa


sharkkk
16-04-2014, 09:59
Salve a tutti,

è corretto nella programmazione OO implementare una classe solo ed esclusivamente tramite il suo costruttore oppure è pura eresia?

class pippo{
public pippo(int value){
[fa delle cose complesse che nulla hanno a che fare con l'inizializzazione delle variabili]
}
}

è accettabile anche poter istanziare gli oggetti semplicemente facendo:
new pippo(2);

oppure è molto piu corretto fare:
pippo Pippo = new Pippo(2);

sapendo però che poi la variabile Pippo sarebbe poi inutilizzata?

killercode
16-04-2014, 10:19
È brutto e stupido, se non ti serve creare oggetti usa una classe di metodi statici

wingman87
16-04-2014, 10:42
È brutto e stupido, se non ti serve creare oggetti usa una classe di metodi statici

*

gianmpu
16-04-2014, 11:03
è accettabile anche poter istanziare gli oggetti semplicemente facendo:
new pippo(2);

oppure è molto piu corretto fare:
pippo Pippo = new Pippo(2);
Ci sono casi in cui si istanziano direttamente gli oggetti con la new. Il primo esempio che mi viene in mente è quando si legge un file con un BufferedReader. Questo ha bisogno di essere associato ad un InputStreamReader, anche se poi quest'ultimo non verrà usato. In genere si scrive quindi qualcosa del tipo

BufferedReader br =new BufferedReader(new InputStreamReader(is));

dove is è l'InputStream

wingman87
16-04-2014, 11:12
Ci sono casi in cui si istanziano direttamente gli oggetti con la new. Il primo esempio che mi viene in mente è quando si legge un file con un BufferedReader. Questo ha bisogno di essere associato ad un InputStreamReader, anche se poi quest'ultimo non verrà usato. In genere si scrive quindi qualcosa del tipo

BufferedReader br =new BufferedReader(new InputStreamReader(is));

dove is è l'InputStream
In questo caso l'oggetto InputStreamReader implementa una qualche interfaccia tramite la quale viene utilizzato dal BufferedReader. Lo dico per sharkkk che chiedeva se avesse senso una classe che implementa solo un costruttore (e, giusto per completezza, immagino non erediti da altre classi un qualche stato e metodo).

sharkkk
16-04-2014, 13:20
grazie mille per le risposte.

immaginavo che fosse brutto ma volevo la conferma da persone estremamente più esperte di me.

biowep
16-04-2014, 15:07
Beh io, da totale inesperto sto scrivendo una libreria per fare delle operazioni matematiche ed ogni espressione è rappresentata da un'istanza. La classe quindi contiene solo il metodo costruttore che prende in input la stringa con l'espressone matematica e nel crea un oggetto. Non mi sembrava così stupido :D
Penso che se tu avessi bisogno di oggetti con contenuti diversi non si potrebbe considerare stupido.

try {
Expression a = new Expression("10x^2-5x+5");
Expression b = new Expression("3+2-logx");
...
} catch (...) {
...
}

EDIT:
Ahh scusa, non ho letto bene.
Se vuoi fare solo
new Classe();
senza nemmeno salvare l'istanza è insensato completamente. Puoi usare un metodo statico anonimo (static {}) nella classe.

WarDuck
19-04-2014, 18:06
Nel costruttore dovrebbe esserci solo ed esclusivamente l'inizializzazione in maniera che i metodi possano "fidarsi" delle variabili di istanza e operarci correttamente.

Ad esempio è scorretto inizializzare una variabile di istanza in un metodo.

sottovento
19-04-2014, 19:22
grazie mille per le risposte.

immaginavo che fosse brutto ma volevo la conferma da persone estremamente più esperte di me.

Perche' brutto e stupido? Sembra che sia lo stile verso il quale si sta andando:

new Thread(() -> System.out.println("Hello,world")).start();