CodeGym /Java Blog /Random-IT /Rimasto bloccato? Le parti più difficili dell'apprendimen...
John Squirrels
Livello 41
San Francisco

Rimasto bloccato? Le parti più difficili dell'apprendimento di Java e come superarle

Pubblicato nel gruppo Random-IT
Come sai, consigliamo ai principianti di programmare di iniziare a imparare i linguaggi di programmazione con Java e CodeGym ha tutto per rendere digeribile il processo di apprendimento di Java anche per gli studenti più impreparati. Ma per quanto gli elementi di ludicizzazione, la storia semplice e i personaggi divertenti aiutino a facilitare questo processo, l'apprendimento completo dei fondamenti di Java raramente è privo di sfide per la maggior parte dei nuovi studenti. Rimasto bloccato?  Parti più difficili dell'apprendimento di Java e come superarle - 1Oggi daremo uno sguardo ad alcune delle aree più difficili dei fondamenti della programmazione Java, cercando di capire perché molte persone li trovano difficili e se c'è qualcosa che puoi fare al riguardo.

1. Generici

I generici in Java sono tipi che hanno un parametro. Quando si crea un tipo generico, si specifica non solo un tipo, ma anche il tipo di dati con cui funzionerà. I generici sono spesso menzionati dagli studenti Java come una delle parti più difficili da comprendere di Java. “Il mio problema principale è ancora trattare con i generici. È molto più semplice quando si hanno metodi con parametri da seguire, ma diventa confuso quando si deve scrivere il proprio”, ha detto uno studente anonimo di Java.

Suggerimenti e raccomandazioni

Ecco un'opinione su Generics in Java di Ravi Reddy, programmatore esperto e professore universitario: “Java Generics fa una cosa che i template C++ non fanno: implementare la sicurezza dei tipi. L'implementazione dei modelli C++ è un semplice trucco del pre-processore e non garantisce l'indipendenza dai tipi. I generici in Java sono come i modelli C++ ma con un'ulteriore indipendenza dai tipi. E IMHO, la sicurezza del tipo è una caratteristica essenziale di qualsiasi buon ambiente di sviluppo. E sì! Possono creare confusione a causa dei nostri spostamenti mentali tra i parametri e i tipi. Ma credo che valga la pena spendere del tempo per padroneggiarli. Perché mi sono ritrovato a "pensare" molto meglio in Java dopo aver compreso le interfacce e i generici."

2. Multithreading

Il multithreading in Java è un processo di esecuzione simultanea di due o più thread per ottenere il massimo utilizzo della CPU da parte dell'applicazione. Il multithreading risolve compiti molto importanti e può rendere i nostri programmi più veloci. Spesso molte volte più veloce. Ma è considerato uno degli argomenti su cui molti nuovi studenti di Java tendono a rimanere bloccati. Tutto perché il multithreading può anche creare problemi invece di risolverli. Ci sono due problemi specifici che il multithreading può creare: deadlock e race condition. Il deadlock è una situazione in cui più thread sono in attesa di risorse detenute l'uno dall'altro e nessuno di essi può continuare a essere eseguito. Una race condition è un errore di progettazione in un sistema o un'applicazione multithread, in cui il funzionamento del sistema o dell'applicazione dipende dall'ordine in cui vengono eseguite parti del codice.

Suggerimenti e raccomandazioni

Ecco una buona raccomandazionesu come gestire il multithreading da S.Lott, architetto di software e utente attivo di StackExchange, un popolare sito Web di domande e risposte: “Il multithreading è semplice. La codifica di un'applicazione per il multi-threading è molto, molto semplice. C'è un semplice trucco, e questo consiste nell'usare una coda di messaggi ben progettata (non arrotolare la tua) per passare i dati tra i thread. La parte difficile è cercare di fare in modo che più thread aggiornino magicamente un oggetto condiviso in qualche modo. È allora che diventa soggetto a errori perché le persone non prestano attenzione alle condizioni di gara presenti. Molte persone non usano le code dei messaggi e provano ad aggiornare gli oggetti condivisi e si creano problemi. Ciò che diventa difficile è progettare un algoritmo che funzioni bene quando si passano dati tra più code. È difficile.

3. Problemi relativi al percorso di classe

Gli errori del percorso di classe sono anche considerati uno dei problemi più lamentati che gli sviluppatori Java devono affrontare nel loro lavoro quotidiano. “I problemi di Classpath possono richiedere molto tempo per il debug e tendono a verificarsi nei momenti e nei luoghi peggiori possibili: prima dei rilasci e spesso in ambienti in cui il team di sviluppo ha poco o nessun accesso. Possono anche verificarsi a livello di IDE e diventare una fonte di produttività ridotta", afferma Vasco Ferreira, esperto sviluppatore Java/Javascript e autore di tutorial relativi alla programmazione.

Suggerimenti e raccomandazioni

“I problemi del percorso di classe non sono di così basso livello o inavvicinabili come potrebbero sembrare a prima vista. Riguarda i file zip (jar) presenti/non presenti in determinate directory, come trovare tali directory e come eseguire il debug del classpath in ambienti con accesso limitato. Conoscendo un insieme limitato di concetti come Class Loader, Class Loader Chain e modalità Parent First / Parent Last, questi problemi possono essere affrontati in modo efficace", spiega l'esperto.

4. Il polimorfismo e il suo corretto utilizzo

Quando si tratta di principi di OOP, molte persone affermano di aver avuto difficoltà a comprendere il polimorfismo. Il polimorfismo è la capacità di un programma di trattare oggetti con la stessa interfaccia nello stesso modo, senza informazioni sul tipo specifico dell'oggetto. Nonostante il polimorfismo sia un argomento piuttosto semplice, è piuttosto esteso e costituisce una buona parte delle fondamenta di Java. Per molti studenti, il polimorfismo è una prima difficoltà nell'apprendimento di Java. Tutto perché esistono diverse forme di polimorfismo utilizzate in contesti diversi, che possono creare confusione.

Suggerimenti e raccomandazioni

Non c'è altro modo per affrontare il polimorfismo se non impararlo. Ecco come spiega Torben Mogensen, che insegna programmazione all'Università di Copenhagenquesto concetto: “Semplice sovraccarico: + può significare sia addizione di numeri interi, addizione in virgola mobile e (in alcune lingue) concatenazione di stringhe. Polimorfismo del sottotipo: se B è un sottotipo di (eredita da) A, qualsiasi valore di tipo B può essere utilizzato in un contesto che prevede un valore di tipo A. Polimorfismo parametrico: un tipo può essere parametrizzato con parametri di tipo, in modo contesti diversi possono fornire argomenti di tipo diverso, quindi si istanzia il tipo parametrizzato a diversi tipi concreti. Questo è anche chiamato "templates" o "generics" e nei linguaggi OO è tipicamente specificato usando parentesi angolari (come T<A>). Polimorfismo dell'interfaccia. Questo è fondamentalmente un meccanismo in cui si limita il polimorfismo dei sottotipi ai sottotipi che implementano una determinata interfaccia o il polimorfismo parametrico ai parametri di tipo che implementano una determinata interfaccia.

5. Riflessione

La riflessione è un meccanismo per esplorare i dati su un programma mentre è in esecuzione. Reflection consente di esplorare informazioni su campi, metodi e costruttori di classi. Consente inoltre di lavorare con tipi che non erano presenti in fase di compilazione, ma che sono diventati disponibili in fase di esecuzione. La riflessione e un modello logicamente coerente per l'emissione di informazioni sugli errori consentono di creare un codice dinamico corretto. Ma per molte persone non è così facile capire come usare Reflection.

Suggerimenti e raccomandazioni

“In caso di reflection e Java, la reflection consente a Java, progettato per essere tipizzato staticamente, di essere tipizzato dinamicamente. La digitazione dinamica non è intrinsecamente malvagia. Sì, consente al programmatore di infrangere determinati principi OOP, ma allo stesso tempo consente molte potenti funzionalità come il proxy di runtime e l'iniezione di dipendenza. Sì, Java ti consente di spararti ai piedi usando la riflessione. Tuttavia, devi puntare in modo molto esplicito la pistola al tuo piede, togliere la sicura e premere il grilletto", spiega Jayesh Lalwani, un esperto programmatore Java e architetto di applicazioni.

6. Flussi di ingresso/uscita

Gli stream ti consentono di lavorare con qualsiasi origine dati: Internet, il file system del tuo computer o qualcos'altro. Gli stream sono uno strumento universale. Consentono a un programma di ricevere dati da qualsiasi luogo (flussi di input) e di inviarli ovunque (flussi di output). Il loro compito è lo stesso: prendere i dati da un posto e inviarli a un altro. Esistono due tipi di flussi: flussi di input (utilizzati per ricevere dati) e flussi di output (per l'invio di dati). Ciò che rende difficile per molte persone capire l'uso dei flussi è il fatto che Java ha più classi di flussi di I/O.

Suggerimenti e raccomandazioni

“Java ha così tante classi di flusso I/O principalmente a causa di due fattori che contribuiscono. Il primo è l'eredità. Alcune classi sono ancora lì per ragioni storiche e non sono deprecate poiché non sono considerate dannose. In secondo luogo, flessibilità. Applicazioni diverse hanno requisiti diversi e, quindi, hai più opzioni a seconda delle tue esigenze. Astrazioni utili portano chiarezza quando lo leggi e con poche righe di codice puoi fare molto", afferma Jonas Mellin, un esperto Java dalla Svezia. Quali aspetti di Java hai trovato più difficili da comprendere o su quali sei rimasto bloccato per un po' di tempo? Condividi le tue esperienze nei commenti.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION