Printf o println?

di il
4 risposte

Printf o println?

Salve a tutti, studio da poco java e mi sono ritrovato di fronte a un dubbio da novellino.
Ho notato che se si usa printf per stampare cose come
System.out.printf("il valore di a è:%d ,mentre il valore di b è:%d",a,b);
la riga da scrivere è solo una, cosa che non accadrebbe utilizzando println.
Alcune persone mi hanno consigliato di usare comunque println, mi chiedo se sia un consiglio dato dall'abitudine di utilizzare println dato che la possibilità di usare printf è arrivata dopo, o se ci sia un vantaggio vero e proprio.

Forse sbaglio ma a me sembra di snellire il codice usando printf.
Ditemi voi

4 Risposte

  • Re: Printf o println?

    federico992 ha scritto:


    mi chiedo se sia un consiglio dato dall'abitudine di utilizzare println dato che la possibilità di usare printf è arrivata dopo, o se ci sia un vantaggio vero e proprio.
    I print/println esistono da sempre in PrintStream (e idem in PrintWriter). La funzionalità di formattazione delle stringhe, con gli specificatori di formato, invece è stata introdotta in Java 5.
    I printf/format sono appunto i metodi aggiunti in diverse classi per accedere comodamente a questa funzionalità.
    Ah, printf è uguale a format, è stato aggiunto solo per far contento chi arriva dal "C".

    Il "motore" interno della formattazione invece è in java.util.Formatter. Basta che guardi la sua corposa (!) documentazione javadoc.
  • Re: Printf o println?

    Sei stato abbastanza chiaro. =)
    Però si fa brutta figura se si usa printf?
    Su un post ho visto che molti hanno storto il naso di fronte a printf.
  • Re: Printf o println?

    federico992 ha scritto:


    Però si fa brutta figura se si usa printf?
    No affatto! perché dovrebbe?

    federico992 ha scritto:


    Su un post ho visto che molti hanno storto il naso di fronte a printf.
    Il printf del linguaggio "C" è parecchio limitato e pure "fragile", perché il runtime non può fare controlli sulla correttezza dei valori rispetto agli specificatori di formato.

    Se in "C" fai

    int v = 1000;
    printf("%s\n", v);

    Il runtime non può sapere se quello che hai passato è davvero un puntatore ad una stringa oppure no. In ambiente 32 bit un puntatore ha la stessa dimensione (in bit) di un int. Un compilatore un po' sveglio potrebbe fare dei controlli ed emettere un warning ma quel codice gira tranquillamente. Solo che è altamente probabile, quasi certo, che quel codice mandi in crash la applicazione con il classico segmentation fault.

    In Java la formattazione con printf/format è estremamente più robusta. Quelli che vengono passati sono oggetti e oltretutto in un array, quindi verificabile come lunghezza.
    Il motore della formattazione è in grado di fare tutta una serie di controlli tra gli specificatori di formato e gli oggetti passati. Se c'è qualcosa che non quadra viene lanciata una eccezione unchecked (una delle varie sotto-classi di java.util.IllegalFormatException).

    Inoltre la formattazione di Java è in grado di:
    - gestire date/ore
    - gestire la localizzazione di numeri/date con un Locale esplicito o quello predefinito.
    - gestire la specifica di indici negli specificatori es. %3$s per indirizzare in modo differente gli argomenti

    queste tre cose più svariate altre riguardo specificatori, flag, ecc... sono tutte cose che il printf del C semplicemente NON ha e se le può tranquillamente sognare. In definitiva: tra il printf del C e i printf/format di Java c'è praticamente un abisso.
  • Re: Printf o println?

    Grazie ora ho le idee chiare!
    Complimenti.
Devi accedere o registrarti per scrivere nel forum
4 risposte