Problema con un campo di esemplare

di il
3 risposte

Problema con un campo di esemplare

Ciao a tutti,
non riesco a capire se è possibile nella definizione di una classe, ed in particolare (al suo interno) di un costruttore, creare un campo di classe (che quindi andrà ad influire sul mio oggetto) solo se si verifica una determinata condizione.

Mi spiego meglio: se una certa proposizione è true, allora il mio nuovo oggetto avrà un nuovo campo di esemplare.

Esempio pratico (stupido, spero sia comprensibile): ho un oggetto "vaso". SE quel vaso viene utilizzato per contenere fiori, allora l'oggetto avrà un nuovo campo di esemplare "numero di fiori".

Se inserisco una condizione "if" all'interno del costruttore del tipo

if(condizione)
nuovoCampoDiEsemplare=valore;


chiaramente non risolvo il problema, in quanto nella definizione all'inizio della classe dei campi di esemplare il "nuovoCampoDiEsemplare" esiste e viene automaticamente assegnato all'oggetto al di là della condizione if, con un valore di default (mi sbaglio?).

Idee?

Grazie mille

3 Risposte

  • Re: Problema con un campo di esemplare

    Giammarco ha scritto:


    non riesco a capire se è possibile nella definizione di una classe, ed in particolare (al suo interno) di un costruttore, creare un campo di classe (che quindi andrà ad influire sul mio oggetto) solo se si verifica una determinata condizione.

    Mi spiego meglio: se una certa proposizione è true, allora il mio nuovo oggetto avrà un nuovo campo di esemplare.
    Innanzitutto quando si parla di "campo di classe" generalmente si intende (e io intendo) un campo static, di proprietà della classe, non distinto per ciascuna istanza della classe.
    Presumo intendevi "di istanza".

    Giammarco ha scritto:


    Esempio pratico (stupido, spero sia comprensibile): ho un oggetto "vaso". SE quel vaso viene utilizzato per contenere fiori, allora l'oggetto avrà un nuovo campo di esemplare "numero di fiori".

    Se inserisco una condizione "if" all'interno del costruttore del tipo

    if(condizione)
    nuovoCampoDiEsemplare=valore;


    chiaramente non risolvo il problema, in quanto nella definizione all'inizio della classe dei campi di esemplare il "nuovoCampoDiEsemplare" esiste e viene automaticamente assegnato all'oggetto al di là della condizione if, con un valore di default (mi sbaglio?).
    I campi non li puoi creare "dinamicamente" a runtime. O ci sono nel senso che chi ha scritto il sorgente li ha definiti o non ci sono.

    Poi sì, i campi di classe e di istanza vengono inizializzati come minimo al valore di "default" (0 per numeri, false per boolean, null per reference). Ovvero non è possibile (come invece in C/C++) osservare un valore "spazzatura" dovuto a qualcosa di precedente.
    E detto questo: quale è il problema con il valore di default?
  • Re: Problema con un campo di esemplare

    andbin ha scritto:


    Poi sì, i campi di classe e di istanza vengono inizializzati come minimo al valore di "default" (0 per numeri, false per boolean, null per reference). Ovvero non è possibile (come invece in C/C++) osservare un valore "spazzatura" dovuto a qualcosa di precedente.
    E detto questo: quale è il problema con il valore di default?
    Scusami, intendevo "campo di esemplare" sì.

    Il problema sta nel fatto che nella consegna dell'esercizio mi viene detto che l'oggetto della classe "nuovo"(appena creato) non ha un determinato campo. Poi però, data una condizione (es. è un vaso di fiori), il campo deve esserci. Prima non mi va bene che ci sia, perché non mi va bene pensare che quel vaso ha "0 fiori", perché è concettualmente sbagliato (spero di essermi spiegato).

    Il problema se guardo solo al risultato è risolvibile facilmente in altri modi, posso gestirlo e avere una risposta adeguata senza problemi, forse anche in meno tempo e in meno righe di codice. Il mio obiettivo era quello di capire se era possibile fare una cosa del genere, al di là dell'efficienza o meno dell'operazione. Concludo che non è possibile?
  • Re: Problema con un campo di esemplare

    Giammarco ha scritto:


    mi viene detto che l'oggetto della classe "nuovo"(appena creato) non ha un determinato campo. Poi però, data una condizione (es. è un vaso di fiori), il campo deve esserci.
    Il punto, lo ripeto, è che un campo o è stato previsto fin dall'inizio (definito cioè nel sorgente) oppure non esiste. Non è possibile avere un oggetto che all'inizio non ha un campo X e poi dopo per qualche condizione particolare ce l'ha ... magicamente.
    Java funziona così. In Javascript invece un oggetto può non avere subito una proprietà e poi successivamente averla ma semplicemente perché in Javascript gli oggetti sono (detto grossolanamente) una "mappa" di proprietà. In Java no.

    Giammarco ha scritto:


    non mi va bene pensare che quel vaso ha "0 fiori", perché è concettualmente sbagliato.
    Può non andare bene per gli obiettivi che ti sono stati posti o per chi ti ha richiesto la realizzazione di questa cosa ma ... di per sé, in senso generale, non è affatto "sbagliato".

    Giammarco ha scritto:


    Il problema se guardo solo al risultato è risolvibile facilmente in altri modi, posso gestirlo e avere una risposta adeguata senza problemi, forse anche in meno tempo e in meno righe di codice. Il mio obiettivo era quello di capire se era possibile fare una cosa del genere, al di là dell'efficienza o meno dell'operazione. Concludo che non è possibile?
    Se pensiamo solo a livello di campo, si potrebbe avere un campo Integer, che quindi può essere null magari per indicare concettualmente "non c'è questa informazione". Che sarebbe un pelino diverso da un valore 0 ma in ogni caso il campo esiste.

    Una alternativa è la ereditarietà: una classe Vaso (senza campo per il numero di fiori) e una sotto classe VasoConFiori che ha appunto un campo per il numero di fiori.
    Se istanzio un Vaso non devo passare nulla, se istanzio un VasoConFiori devo passargli il numero di fiori. Il punto è che se ho un oggetto Vaso, non posso certo "trasformarlo" in VasoConFiori e viceversa.
    Quindi mi viene da pensare che nemmeno questo ti possa servire.
Devi accedere o registrarti per scrivere nel forum
3 risposte