Aiutami a recuperare ciò che mi è mancato da Java 1.4.2 [chiuso]


14

Sto per iniziare la mia prima posizione professionale come sviluppatore di software e probabilmente scriverò molto codice Java. Non so molto di cosa scriverò in particolare, e inoltre ho interessi abbastanza ampi quando si tratta di scrivere codice.

Per motivi che non vale la pena discutere, il mio ultimo stage mi ha fatto codificare solo per gli SDK Java 1.3 e 1.4. Inoltre, la mia formazione universitaria si è concentrata principalmente su algoritmi, strutture di dati e altre teorie, non su funzionalità linguistiche o librerie.

Quindi, tenendo presente quanto sopra, su quali caratteristiche, classi, ecc. Nell'attuale versione di Java (su quale numero siamo adesso, comunque?) Varrebbe la pena dedicare il mio tempo a leggere e perché? Cosa mi sono perso dall'1.4.2 che ti semplifica la vita come programmatore?

Anche gli esempi e le storie di come hai scoperto un pacchetto particolare o alcuni di questi e metterli in pratica sarebbero grandiosi.


4
Quali sono questi motivi che non vale la pena discutere? Molti di noi sono incuriositi ...
5arx il

@ 5arx Beh, ho lavorato con una versione 1.4 di Java per la programmazione robotica, perché per qualche motivo era ciò che la nostra piattaforma supportava.
Daniel Gratzer,

Risposte:


15

Le modifiche che ritengo più importanti sono:

  • Generici (ad es. Raccolte tipizzate, come Set)

  • Migliorato per il ciclo (per (String s: set) {...})

  • Autoboxing / unboxing (conversione automatica tra tipi come Integer in int e viceversa)

  • Typesafe enums (enum è ora una parola chiave, i tipi possono essere creati da enums)

  • Varargs (per la funzione printf (), consente un numero variabile di argomenti)

  • Importazione statica (ora è possibile importare metodi statici di una classe, come java.lang.Math)

  • annotazioni

  • java.util.concurrent (mostra la concorrenza di java)

Leggi anche a quale Java stai mirando? , per comprendere meglio ciascuna delle tre versioni.


1
++ i miglioramenti per loop, autoboxing / unboxing, varargs, importazione statica sono semplici
Michael Wiles,

Perché i programmatori Java chiamano i loop per ogni " forloop avanzato ?"
Max.

2
@Maxpm Perché è così che viene chiamato nelle specifiche del linguaggio Java. Come per JLS, ci sono basi per loop e potenziate per loop. Non sono sicuro del motivo per cui hanno deciso di farlo in questo modo. Forse perché la sintassi non usa una parola chiave speciale e una sorta di fusione con i normali loop.
Malcolm,

10

Il singolo cambiamento più importante nella tua vita di programmazione quotidiana è l'introduzione dei generici che molto probabilmente verranno utilizzati in ogni nuovo modulo che ti verrà chiesto di scrivere, ed è una nuova sintassi confusa.

Generics è il meccanismo che consente ad es. A Listdi contenere stringhe invece di oggetti nudi, in cui il compilatore impone che un elemento da inserire nell'elenco sia una stringa e sa che quando si ottiene un elemento da un elenco è una stringa .

Questo rende i programmi migliori evitando il cast esplicito del runtime sul tipo di destinazione (che è una frequente fonte di errori se lo sbagli) e l'IDE può aiutarti a fare tutto il lavoro sporco poiché sa molto di più sul tuo codice che lo faceva quando era solo un elenco di oggetti.

Joshua Bloch ha scritto una buona introduzione a Generics, disponibile come capitolo di esempio su http://java.sun.com/docs/books/effective/


Per favore, non dirlo alla gente Groovy! "Ciò consente di ottenere programmi migliori evitando il cast di runtime sul tipo di destinazione." def whatever....
Dan Rosenstark,

@Yar, modificato per essere più esplicito. Vorrei AMORE la o attributo "def" "var". Mi renderebbe la vita un po 'più semplice.

Sì, lo stavo solo pensando di recente con Objective-C e idquale è defo var... ma poi di nuovo, la sicurezza della tipizzazione statica al 100% è sorprendente, davvero.
Dan Rosenstark,

@Yar: Adorerai Ada :)
mattnz,

@mattnz perché, in particolare? E mentre siamo qui, funziona sulla JVM?
Dan Rosenstark,

6

L'autoboxing è una bella funzionalità introdotta con Java 5. Proprio come in C # il compilatore ora esegue una conversione automatica tra i tipi primitivi (di base) e le corrispondenti classi di wrapper di oggetti (da int a Integer ecc.) E viceversa. Ciò rende molto meno doloroso lavorare con le Collezioni Java.

Credo che ogni ciclo sia nuovo anche in Java 5. Rende più facile l'iterazione su array (e raccolte), poiché elimina gran parte del solito disordine che coinvolge l'installazione e la gestione di una variabile di indice o di iteratori. Ad esempio:

void myMethod(Collection<myObjectType> c) {
    for (myObjectType o : c)
        o.foo();
}

6

Enum , per sostituire la statica e le costanti finali e aiutarti a rimuovere i riferimenti a stringhe e numeri magici. Un esempio preso dalle brave persone al sole / oracolo :

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7),
    PLUTO   (1.27e+22,  1.137e6);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    public double mass()   { return mass; }
    public double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    public double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    public double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
}

e

public static void main(String[] args) {
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }

6

java.util.concurrent è stato introdotto in 1.5. La miglior risorsa per l'apprendimento è (probabilmente) il libro sulla concorrenza in pratica di Java . La concorrenza IMHO è il vantaggio competitivo più importante di Java rispetto a qualsiasi altra cosa, quindi vale sicuramente la pena conoscerlo bene.


1
+1 Per menzionare il pacchetto simultaneo. È triste che così tanti sviluppatori utilizzino ancora primitive di concorrenza come Thread, wait () / notification () e sincronizzazione, ...
Oliver Weiler,

Infatti. java.util.concurrentcompetere alle primitive è come la gestione automatica della memoria alla gestione manuale della memoria. L'utilizzo di quest'ultimo è solo una ricetta per dedicare più tempo al debug e non offre vantaggi.
Joonas Pulakka,

Esecutori in soccorso! Ancora meglio in Java 6

+1000 se potessi - quel libro è fantastico
Gary Rowe il

4

Bene, StringBuildermi ha aiutato ad accelerare il mio programma. È un equivalente della StringBuffersicurezza senza filo.


Sì. Java efficace afferma che StringBuffer è obsoleto e deve essere sostituito da StringBuilder.
Gary Rowe,

1
La concatenazione con le +stringhe utilizza automaticamente StringBuilder invece di StringBuffer per il livello di origine 1.5 e versioni successive.

4

Ti aiuterò classificando la risposta utile di @ykombinator. La sua lista è una lista degli elementi che userete quotidianamente mentre fate uno sviluppo java "generale".

Basso impatto e bassa difficoltà:

  • Migliorato per il ciclo (per (String s: set) {...})
  • Autoboxing / unboxing (conversione automatica tra tipi come Integer in int e viceversa)
  • Varargs (per la funzione printf (), consente un numero variabile di argomenti)
  • Importazione statica (ora è possibile importare metodi statici di una classe, come java.lang.Math)

Alto impatto e media difficoltà:

  • Typesafe enums (enum è ora una parola chiave, i tipi possono essere creati da enums)

Alto impatto e alta difficoltà:

  • annotazioni
  • Generics

Basso impatto e molto difficile (verrà utilizzato solo se non si esegue il threading avanzato)

  • java.util.concurrent (mostra la concorrenza di java)

Suggerirei quindi di leggere i documenti / la guida su pezzi a basso impatto e difficili - sono facili da raccogliere. Trascorrere un po 'di tempo in annotazioni e generici - le annotazioni sono molto utili e i generici possono diventare piuttosto complicati.

Guarda il nuovo contenuto della concorrenza solo se devi eseguire il threading.


4

Dal momento che non posso commentare perché ho meno di 50 anni lascerò una risposta. È già stato menzionato ma lo ripeterò di nuovo: annotazioni! Questo tipo di metadati è diventato la cosa più importante nei miei anni di esperienza con Java. Ben usato come alcuni framework, rende il codice molto più conciso e pulito. Ad esempio, le annotazioni possono:

  • Converti un oggetto in un'entità @Entity
  • Convertire un metodo in un servizio REST @GET
  • Spiega che un metodo non restituirà mai null @nonnull
  • Impostare un oggetto su un campo per l'iniezione di dipendenza @inject

E ovviamente puoi creare le tue annotazioni e sapere se un metodo, una classe o un campo sono annotati usando la riflessione.


2
Per essere precisi, le annotazioni non possono fare queste cose, in quanto inseriscono semplicemente meta-informazioni nel codice, su cui altri codici - spesso un caricatore di classi speciale - possono agire. Considero le annotazioni come un'ottima soluzione generale a molti problemi.

3

L'apprendimento con l'esempio funziona per me

Ecco un breve esempio di Java 6 idiomatico

public class Main {
  public static void main(String[] args) {
    // Shows a list forced to be Strings only
    // The Arrays helper uses generics to identify the return type
    // and takes varargs (...) to allow arbitary number of arguments
    List<String> genericisedList = Arrays.asList("A","B","C");

    // Demonstrates a for:each loop (read as for each item in genericisedList)
    for (String item: genericisedList) {
      System.out.printf("Using print formatting: %s%n",item);
    }

    // Note that the object is initialised directly with a primitive (autoboxing)
    Integer autoboxedInteger = 1;
    System.out.println(autoboxedInteger);

  }
}

Non preoccuparti di Java5, è deprecato rispetto a Java6.

Passaggio successivo, annotazioni. Questi semplicemente definiscono gli aspetti del tuo codice che consentono ai lettori di annotazioni di compilare la configurazione del bollettino per te. Si consideri un semplice servizio Web che utilizza la specifica JAX-RS (comprende gli URI RESTful). Non ti devi preoccupare di fare tutto il brutto WSDL e divertirti con Axis2 ecc., Vuoi un risultato veloce. Bene, fai questo:

// Response to URIs that start with /Service (after the application context name)
@Path("/Service")
public class WebService {

  // Respond to GET requests within the /Service selection
  @GET
  // Specify a path matcher that takes anything and assigns it to rawPathParams
  @Path("/{rawPathParams:.*}")
  public Response service(@Context HttpServletRequest request, @PathParam("rawPathParams") String rawPathParams) {
    // Do some stuff with the raw path parameters 

    // Return a 200_OK
    return Response.status(200).build();
  }
}

Scoppio. Con un po 'di magia di configurazione nel tuo web.xml sei fuori. Se stai compilando con Maven e hai configurato il plug-in Jetty, il tuo progetto avrà il suo piccolo web server pronto all'uso (non giocherellare con JBoss o Tomcat per te), e il codice sopra risponderà agli URI del modulo:

GET http://localhost:8080/contextName/Service/the/raw/path/params

Lavoro fatto.


3

Caspita che era un tuffo nel passato! Non uso Java da 4 anni e non è cambiato nulla in quel momento!

C'è un elenco di funzionalità per versione , ma ecco la parte importante (ovviamente plagiata) ...

J2SE 5.0 (30 settembre 2004)

  • Generici: fornisce sicurezza di tipo in fase di compilazione (statica) per le raccolte ed elimina la necessità della maggior parte dei tipi di digitazione (conversione del tipo).
  • Metadati: chiamati anche annotazioni; consente ai costrutti di linguaggio come classi e metodi di essere etichettati con dati aggiuntivi, che possono quindi essere elaborati da utility che riconoscono i metadati.
  • Autoboxing / unboxing: conversioni automatiche tra tipi primitivi (come int) e classi wrapper primitive (come Integer).
  • Enumerazioni: la parola chiave enum crea un typesafe, un elenco ordinato di valori (come Day.MONDAY, Day.TUESDAY, ecc.). In precedenza ciò era possibile solo con numeri interi costanti non tipografici o classi costruite manualmente (modello di enumerazione typesafe).
  • Swing: nuovo aspetto personalizzabile, chiamato synth.
  • Varargs: l'ultimo parametro di un metodo può ora essere dichiarato usando un nome di tipo seguito da tre punti (es. Void drawtext (String ... lines)). Nel codice chiamante è possibile utilizzare qualsiasi numero di parametri di quel tipo e questi vengono quindi inseriti in un array per essere passati al metodo, oppure in alternativa il codice chiamante può passare un array di quel tipo.
  • Migliorata per ogni ciclo: la sintassi del ciclo for viene estesa con una sintassi speciale per iterare su ogni membro di un array o di qualsiasi Iterable, come le classi Collection standard, usando un costrutto del modulo:

Java SE 6 (11 dicembre 2006)

  • Il supporto per le versioni precedenti di Win9x è stato abbandonato. Non ufficialmente Java 6 Update 7 è l'ultima versione di Java mostrata per funzionare su queste versioni di Windows. Si ritiene che ciò sia dovuto alle principali modifiche nell'aggiornamento 10.
  • Supporto per il linguaggio di scripting: API generica per una stretta integrazione con i linguaggi di scripting e l'integrazione di Mozilla JavaScript Rhino integrata
  • Drammatici miglioramenti delle prestazioni per la piattaforma principale e Swing.
  • Supporto del servizio Web migliorato tramite JAX-WS
  • Supporto JDBC 4.0.
  • API del compilatore Java un'API che consente a un programma Java di selezionare e richiamare un compilatore Java a livello di codice.
  • Aggiornamento di JAXB alla versione 2.0: inclusa l'integrazione di un parser StAX.
  • Supporto per annotazioni inseribili
  • Molti miglioramenti della GUI, come l'integrazione di SwingWorker nell'API, l'ordinamento e il filtro delle tabelle e il doppio buffering reale di Swing (eliminando l'effetto dell'area grigia).
  • I miglioramenti di JVM includono: sincronizzazione e ottimizzazioni delle prestazioni del compilatore, nuovi algoritmi e aggiornamenti agli algoritmi di garbage collection esistenti e prestazioni di avvio dell'applicazione.

Questo è tutto. Java SE 7.0 sembra più interessante ma non è ancora stato rilasciato.

Considerando quante nuove funzionalità linguistiche e API sono state aggiunte a C # negli ultimi 4 anni, sono abbastanza sorpreso. Cosa sta succedendo a Sun / Oracle?


Sun decise di aprire open source Java. Questa è la cosa che ha assicurato che indipendentemente da ciò che Oracle decide di fare, possiamo ancora eseguire OpenJDK su scatole Linux. Ciò li ha solo ritardati di 18-24 mesi ...

@ Thorbjørn - questo potrebbe spiegarlo. È un peccato quante interruzioni ha causato questa acquisizione. Immagino che C # goda della stabilità comparativa: abbiamo avuto lambda dal 2006, dove a quanto pare non entreranno in Java fino al 2012 ora.
Sheikhjabootie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.