Java dubbio su costruzione oggetti

di il
5 risposte

Java dubbio su costruzione oggetti

Buonasera. Sto studiando Java per la prima volta, ma avendo già un background di programmazione in altri linguaggi anche OOP, sto facendo uno studio accelerato. Tuttavia mi sorgono alcuni dubbi in merito alla costruzione di certi oggetti. per esempio se definisco una classe, per creare un oggetto di tale classe devo chiamare un costruttore, ma per classi cme String posso assegnare direttamente una stringa, senza chiamare il costruttore con new e passarli la stringa come parametro, stesso discorso con le classi wrapper per i tipi base (pur essendoci la possibilità di usare costruttori). Com'è possibile specificare se un oggetto di una classe possa essere inizializzato "direttamente" oppure per forza con costruttori?

5 Risposte

  • Re: Java dubbio su costruzione oggetti

    oleg ha scritto:


    ma per classi cme String posso assegnare direttamente una stringa, senza chiamare il costruttore con new e passarli la stringa come parametro, stesso discorso con le classi wrapper per i tipi base (pur essendoci la possibilità di usare costruttori). Com'è possibile specificare se un oggetto di una classe possa essere inizializzato "direttamente" oppure per forza con costruttori?
    Di tutto il framework standard, String è una classe molto particolare, sia perché ha un utilizzo vastissimo e anche perché viene trattata in modo speciale dal compilatore, innanzitutto per il fatto di poter definire nel sorgente dei valori "letterali" di tipo String, semplicemente mettendo il testo tra apici.

    String msg = "Ciao";

    Qui non c'è alcun new esplicito, a runtime quel "Ciao" denota già il riferimento ad un oggetto String. Naturalmente String ha svariati costruttori e questi sono comunque tuttora usabili (anche se il costruttore String(String) di fatto è inutile e non necessario).

    Per le classi wrapper dei primitivi, non è la stessa cosa ma da Java 5 è possibile sfruttare l'auto-boxing/unboxing. È tuttora possibile, ad oggi, usare ad esempio il costruttore di Integer:

    Integer num = new Integer(123);

    ma da Java 5, essendoci l'autoboxing, è possibile scrivere:

    Integer num = 123;

    I costruttori delle classi wrapper comunque da Java 9 sono stati tutti "deprecati", ovvero sconsigliati proprio a favore del autoboxing o dell'uso esplicito del valueOf(). In futuro questi costruttori deprecati potrebbero essere fisicamente rimossi ma non si sa quando e in quale release di Java.

    Per qualunque altra classe si deve creare un oggetto invocando un costruttore (a patto che sia accessibile e in classe non astratta).
  • Re: Java dubbio su costruzione oggetti

    Ti ringrazio dell'esaustiva risposta. Ma vorrei capire meglio, in una mia classe poso far si che si "attivi" l'autoboxing, o è solo riservato a quelle classi wrapper? Per esempio se io definissa la mia classe MyInteger, come potrei fare per iniziallizare il campo int "bypassando" il costruttore
  • Re: Java dubbio su costruzione oggetti

    oleg ha scritto:


    in una mia classe poso far si che si "attivi" l'autoboxing, o è solo riservato a quelle classi wrapper?
    No, è un trattamento speciale solo per gli 8 tipi primitivi e le rispettive 8 classi wrapper.
  • Re: Java dubbio su costruzione oggetti

    Il C++ permette la definizione di operatorio (come l'assegnamento) e la definizione di costruttori che permettono di fare la 'conversione automatica' (autoboxing) .

    Sembra 'figo', ma alla lunga, sono piu' le volte che danno problemi di quelle che ne risolvono.

    Quindi conviene SEMPRE ragionare in termini di 'chiamata di un costruttore' o, per maggiore comodita', chiamata di un 'factory method', cioe' un metodo statico che chiama il costruttore.

    L'idea del 'factory method' e' fondamentalmente quella che non e' per niente bello che un costruttore generi un'eccezione. Ma se lo fa un normale metodo, e' 'piu' meglio normale'

    Nota: non baypassi MAI il costruttore. Semplicemente invece di chiamarlo tu 'esplicitamente' deleghi il compilatore a farlo. In ogni caso il costruttore viene SEMPRE chiamato.
  • Re: Java dubbio su costruzione oggetti

    Grazie migliorabile dell'intervento. Certamente quella di evitare il costruttore non è mai una cosa buona , ma la mia era semplice cuoriosità nel sapere se fosse una cosa riservata a certe classi di java o fosse una funzionalità del linguaggio. Certo venendo dal c++ ci si trova un po limitati in funzionalità ma in cambio c'è meno margine di errori.
Devi accedere o registrarti per scrivere nel forum
5 risposte