CodeGym /Blog Java /Aleatoriu /M-am blocat? Cele mai dificile părți ale învățării Java ș...
John Squirrels
Nivel
San Francisco

M-am blocat? Cele mai dificile părți ale învățării Java și cum să le depășiți

Publicat în grup
După cum știți, recomandăm începătorilor de codificare să înceapă să învețe limbaje de programare cu Java, iar CodeGym are totul pentru a face procesul de învățare a Java să fie digerabil chiar și pentru cei mai nepregătiți studenți. Dar, în măsura în care elementele de gamification, povestea ușoară și personajele amuzante ajută la ușurarea acestui proces, învățarea elementelor fundamentale ale Java în întregime este rareori fără provocări pentru majoritatea noilor cursanți. M-am blocat?  Cele mai dificile părți ale învățării Java și cum să le depășiți - 1Astăzi vom arunca o privire asupra unora dintre cele mai dificile domenii ale bazelor de programare Java, încercând să înțelegem de ce mulți oameni le consideră dificile și dacă aveți ceva de făcut în acest sens.

1. Generice

Genericurile în Java sunt tipuri care au un parametru. Când creați un tip generic, specificați nu numai un tip, ci și tipul de date cu care va funcționa. Genericurile sunt adesea menționate de cursanții Java ca fiind una dintre cele mai dificile părți ale Java pentru ei de înțeles. „Problema mea principală este încă să mă ocup de Generics. Este mult mai ușor când ai metode cu parametri de urmat, dar devine confuz când trebuie să le scrii pe ale tale”, a spus un cursant anonim de Java.

Sfaturi și recomandări

Iată o părere despre Generics în Java de la Ravi Reddy, un programator experimentat și profesor universitar: „Java Generics fac un lucru pe care șabloanele C++ nu îl fac — implementează siguranța tipului. Implementarea șabloanelor C++ este un truc simplu pre-procesor și nu asigură siguranța tipului. Genericurile în Java sunt ca șabloanele C++, dar cu siguranță suplimentară. Și IMHO, siguranța tipului este o caracteristică esențială a oricărui mediu de dezvoltare bun. Si da! Ele pot fi confuze din cauza schimbărilor noastre mentale între parametri și tipuri. Dar cred că a petrece timp pentru a le stăpâni merită efortul. Pentru că m-am trezit „gândind” mult mai bine în Java odată ce am înțeles interfețele și Genericurile”.

2. Multithreading

Multithreading în Java este un proces de executare a două sau mai multe fire de execuție concomitent pentru a obține utilizarea maximă a CPU de către aplicație. Multithreading rezolvă sarcini foarte importante și poate face programele noastre mai rapide. Adesea de multe ori mai repede. Dar este considerat a fi unul dintre subiectele în care mulți cursanți proaspeți de Java tind să rămână blocați. Totul pentru că multithreading poate crea și probleme în loc să le rezolve. Există două probleme specifice pe care le poate crea multithreading: blocaj și condiții de cursă. Deadlock este o situație în care mai multe fire așteaptă resurse deținute unul de celălalt și niciunul dintre ele nu poate continua să ruleze. O condiție de cursă este o eroare de proiectare într-un sistem sau o aplicație cu mai multe fire, în care funcționarea sistemului sau a aplicației depinde de ordinea în care sunt executate părțile codului.

Sfaturi și recomandări

Iată o recomandare bunădespre cum să se ocupe de multithreading de la S.Lott, un arhitect software și utilizator activ al StackExchange, un popular site web de întrebări și răspunsuri: „Multi-threading-ul este simplu. Codarea unei aplicații pentru multi-threading este foarte, foarte ușor. Există un truc simplu, și acesta este să folosiți o coadă de mesaje bine concepută (nu rulați propria dvs.) pentru a transmite date între fire. Partea grea este să încerci ca mai multe fire să actualizeze magic un obiect partajat într-un fel. Atunci devine predispus la erori, deoarece oamenii nu acordă atenție condițiilor de cursă care sunt prezente. Mulți oameni nu folosesc cozile de mesaje și încearcă să actualizeze obiectele partajate și să creeze probleme pentru ei înșiși. Ceea ce devine dificil este proiectarea unui algoritm care funcționează bine atunci când trece date între mai multe cozi. Asta e greu.

3. Probleme în cursul clasei

Erorile Classpath sunt, de asemenea, considerate a fi una dintre cele mai reclamate probleme cu care se confruntă dezvoltatorii Java în munca lor zilnică. „Depanarea problemelor cu Classpath poate consuma mult timp și tind să se întâmple în cele mai proaste momente și locuri posibile: înainte de lansări și adesea în medii în care echipa de dezvoltare are acces puțin sau deloc. Ele se pot întâmpla și la nivel IDE și devin o sursă de productivitate redusă”, spune Vasco Ferreira, un dezvoltator Java/Javascript cu experiență și autor de tutoriale legate de programare.

Sfaturi și recomandări

„Problemele Classpath nu sunt atât de scăzute sau inabordabile pe cât ar putea părea la început. Totul este despre fișierele zip (jars) care sunt prezente / nu sunt prezente în anumite directoare, cum să găsiți acele directoare și cum să depanați calea de clasă în medii cu acces limitat. Cunoscând un set limitat de concepte, cum ar fi Class Loaders, Class Loader Chain și modurile Parent First / Parent Last, aceste probleme pot fi abordate eficient”, explică expertul.

4. Polimorfismul și folosirea lui corectă

Când vine vorba de principiile OOP, mulți oameni spun că le-a fost greu să înțeleagă polimorfismul. Polimorfismul este capacitatea unui program de a trata obiecte cu aceeași interfață în același mod, fără informații despre tipul specific al obiectului. În ciuda faptului că polimorfismul este un subiect destul de de bază, este destul de extins și formează o bună parte a fundației Java. Pentru mulți studenți, polimorfismul este o primă dificultate în învățarea Java. Totul pentru că există diferite forme de polimorfism folosite în contexte diferite, ceea ce poate fi confuz.

Sfaturi și recomandări

Nu există altă modalitate de a face față polimorfismului, în afară de a-l învăța. Iată cum explică Torben Mogensen, care predă programare la Universitatea din Copenhagaacest concept: „Supraîncărcarea simplă: + poate însemna atât adăugarea întregului, adăugarea în virgulă mobilă, cât și (în unele limbi) concatenarea șirurilor. Polimorfism subtip: dacă B este un subtip al (moștenește de la) A, orice valoare de tip B poate fi utilizată într-un context care așteaptă o valoare de tip A. Polimorfism parametric: Un tip poate fi parametrizat cu parametri de tip, astfel încât contexte diferite pot furniza argumente de tip diferit, astfel încât instanțiați tipul parametrizat la diferite tipuri concrete. Aceasta se mai numește și „șabloane” sau „generice” și este în limbajele OO specificate de obicei folosind paranteze unghiulare (cum ar fi T<A>). Polimorfismul interfeței. Acesta este practic un mecanism prin care restricționați polimorfismul subtipului la subtipurile care implementează o anumită interfață sau polimorfismul parametric la parametrii de tip care implementează o anumită interfață.”

5. Reflecție

Reflecția este un mecanism de explorare a datelor despre un program în timp ce acesta rulează. Reflection vă permite să explorați informații despre câmpuri, metode și constructori de clasă. De asemenea, vă permite să lucrați cu tipuri care nu erau prezente în timpul compilării, dar care au devenit disponibile în timpul rulării. Reflecția și un model logic consistent pentru emiterea de informații de eroare fac posibilă crearea unui cod dinamic corect. Dar pentru mulți oameni, nu este atât de ușor să-și dea seama cum să folosească Reflection.

Sfaturi și recomandări

„În cazul reflectării și Java, reflectarea permite Java, care este conceput pentru a fi tastat static, să fie tastat dinamic. Tastarea dinamică nu este în mod inerent rău. Da, permite programatorului să încalce anumite principii POO, dar în același timp permite multe funcții puternice, cum ar fi proxy în timp de execuție și injecția de dependență. Da, Java vă permite să vă împușcați în picior folosind reflexia. Cu toate acestea, trebuie să îndreptați foarte explicit pistolul către picior, să luați siguranța și să apăsați pe trăgaci”, explică Jayesh Lalwani, un programator Java experimentat și arhitect de aplicații.

6. Fluxuri de intrare/ieșire

Fluxurile vă permit să lucrați cu orice sursă de date: internetul, sistemul de fișiere al computerului sau altceva. Fluxurile sunt un instrument universal. Acestea permit unui program să primească date de oriunde (fluxuri de intrare) și să le trimită oriunde (fluxuri de ieșire). Sarcina lor este aceeași: să preia date dintr-un loc și să le trimită în altul. Există două tipuri de fluxuri: fluxuri de intrare (utilizate pentru a primi date) și fluxuri de ieșire (pentru trimiterea datelor). Ceea ce face dificil pentru mulți oameni să înțeleagă utilizarea fluxurilor este faptul că Java are mai multe clase de flux I/O.

Sfaturi și recomandări

„Java are atât de multe clase de flux I/O, în principal datorită a doi factori care contribuie. Prima este moștenirea. Unele clase sunt încă acolo din motive istorice și nu sunt depreciate, deoarece nu sunt considerate dăunătoare. În al doilea rând, flexibilitatea. Diferitele aplicații au cerințe diferite și, prin urmare, aveți mai multe opțiuni în funcție de cerințele dvs. Abstracțiile utile aduc claritate atunci când o citești și cu câteva linii de cod poți face multe”, spune Jonas Mellin, expert Java din Suedia. Ce aspecte ale Java vi s-au părut cel mai greu de înțeles sau în care ați rămas blocat de ceva timp? Împărtășește-ți experiențele în comentarii.
Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION