CodeGym /Java blogg /Slumpmässig /Fastnade? De svåraste delarna av att lära sig Java och hu...
John Squirrels
Nivå
San Francisco

Fastnade? De svåraste delarna av att lära sig Java och hur man övervinner dem

Publicerad i gruppen
Som ni vet rekommenderar vi att koda nybörjare för att börja lära sig programmeringsspråk med Java, och CodeGym har allt för att göra processen att lära sig Java lättsmält även för de mest oförberedda eleverna. Men lika mycket som gamification-element, lättsam berättelse och roliga karaktärer hjälper till att underlätta denna process, att lära sig grunderna i Java till fullo är sällan utan utmaningar för majoriteten av nya elever. Fastnade?  De svåraste delarna av att lära sig Java och hur man övervinner dem - 1Idag ska vi ta en titt på några av de tuffaste områdena i Java-programmeringsgrunderna, och försöka förstå varför många tycker att de är svåra och om det finns något för dig att göra åt det.

1. Generika

Generika i Java är typer som har en parameter. När du skapar en generisk typ anger du inte bara en typ, utan även vilken datatyp den ska fungera med. Generika nämns ofta av Java-elever som en av de svåraste delarna av Java för dem att förstå. "Mitt huvudproblem är fortfarande att hantera Generics. Det är mycket enklare när du har metoder med parametrar att följa, men blir förvirrande när du måste skriva ditt eget”, sa en anonym Java-lärare.

Tips och rekommendationer

Här är en åsikt om Generics i Java från Ravi Reddy, en erfaren programmerare och universitetsprofessor: "Java Generics gör en sak som C++-mallar inte gör — implementera typsäkerhet. Implementeringen av C++-mallar är ett enkelt förprocessortrick och garanterar inte typsäkerhet. Generika i Java är som C++-mallar men med extra typsäkerhet. Och IMHO, typsäkerhet är ett viktigt inslag i alla bra utvecklingsmiljöer. Och ja! De kan vara förvirrande på grund av våra mentala skiftningar mellan parametrarna och typerna. Men jag tror att det är värt ansträngningen att lägga tid på att bemästra dem. För jag fann mig själv "tänka" mycket bättre i Java när jag väl hade förstått gränssnitt och Generics."

2. Flertrådning

Multithreading i Java är en process där två eller flera trådar körs samtidigt för att uppnå maximalt utnyttjande av CPU av applikationen. Multithreading löser mycket viktiga uppgifter och kan göra våra program snabbare. Ofta många gånger snabbare. Men det anses vara ett av de ämnen som många nya Java-lärare tenderar att fastna för. Allt för att multithreading också kan skapa problem istället för att lösa dem. Det finns två specifika problem som multithreading kan skapa: dödläge och tävlingsförhållanden. Deadlock är en situation där flera trådar väntar på resurser som hålls av varandra, och ingen av dem kan fortsätta att köras. Ett race condition är ett designfel i ett flertrådigt system eller program, där driften av systemet eller applikationen beror på i vilken ordning delar av koden exekveras.

Tips och rekommendationer

Här är en bra rekommendationom hur man hanterar multithreading från S.Lott, en mjukvaruarkitekt och aktiv användare av StackExchange, en populär webbplats för frågor och svar: "Multi-threading är enkelt. Att koda en applikation för multi-threading är väldigt, väldigt enkelt. Det finns ett enkelt knep, och det här är att använda en väldesignad meddelandekö (rulla inte din egen) för att skicka data mellan trådar. Det svåra är att försöka få flera trådar att på ett magiskt sätt uppdatera ett delat objekt på något sätt. Det är då det blir felbenäget eftersom folk inte uppmärksammar tävlingsförhållandena som finns. Många människor använder inte meddelandeköer och försöker uppdatera delade objekt och skapa problem för sig själva. Det som blir svårt är att designa en algoritm som fungerar bra när man skickar data mellan flera köer. Det är svårt.

3. Klassvägsproblem

Klassvägsfel anses också vara ett av de mest klagade problemen som Java-utvecklare ställs inför i sitt dagliga arbete. "Klassvägsproblem kan vara tidskrävande att felsöka och tenderar att hända vid sämsta möjliga tider och platser: före releaser och ofta i miljöer där det finns liten eller ingen åtkomst av utvecklingsteamet. De kan också hända på IDE-nivå och bli en källa till minskad produktivitet”, säger Vasco Ferreira, en erfaren Java/Javascript-utvecklare och författare av programmeringsrelaterade handledningar.

Tips och rekommendationer

"Klassvägsproblem är inte så låga eller oåtkomliga som de kan tyckas först. Det handlar om att zip-filer (jars) finns/inte finns i vissa kataloger, hur man hittar dessa kataloger och hur man felsöker klasssökvägen i miljöer med begränsad åtkomst. Genom att känna till en begränsad uppsättning begrepp som Class Loaders, Class Loader Chain och Parent First / Parent Last-lägen kan dessa problem lösas effektivt”, förklarar experten.

4. Polymorfism och att använda den på rätt sätt

När det gäller principerna för OOP säger många att de hade svårt att förstå polymorfism. Polymorfism är ett programs förmåga att behandla objekt med samma gränssnitt på samma sätt, utan information om objektets specifika typ. Trots att polymorfism är ett ganska grundläggande ämne, är det ganska omfattande och utgör en god del av Javas grund. För många elever är polymorfism en första svårighet att lära sig Java. Allt för att det finns olika former av polymorfism som används i olika sammanhang, vilket kan vara förvirrande.

Tips och rekommendationer

Det finns inget annat sätt att hantera polymorfism än att lära sig det. Så här förklarar Torben Mogensen, som undervisar i programmering vid Köpenhamns universitetdetta koncept: "Enkel överbelastning: + kan betyda både heltalsaddition, flyttalsaddition och (på vissa språk) strängsammansättning. Subtyp polymorfism: Om B är en subtyp av (ärver från) A, kan vilket värde av typ B som helst användas i ett sammanhang som förväntar sig ett värde av typ A. Parametrisk polymorfism: En typ kan parametriseras med typparametrar, så att du i olika sammanhang kan ge olika typargument, så du instansierar den parametriserade typen till olika konkreta typer. Detta kallas också "mallar" eller "generics" och är på OO-språk som vanligtvis anges med vinkelparenteser (som T<A>). Gränssnittspolymorfism. Detta är i grunden en mekanism där du begränsar subtyppolymorfism till subtyper som implementerar ett visst gränssnitt eller parametrisk polymorfism till typparametrar som implementerar ett visst gränssnitt."

5. Reflektion

Reflektion är en mekanism för att utforska data om ett program medan det körs. Reflektion låter dig utforska information om fält, metoder och klasskonstruktorer. Det låter dig också arbeta med typer som inte fanns vid kompileringstiden, men som blev tillgängliga under körtiden. Reflektion och en logiskt konsekvent modell för att utfärda felinformation gör det möjligt att skapa korrekt dynamisk kod. Men för många människor är det inte så lätt att förstå hur man använder Reflection.

Tips och rekommendationer

"När det gäller reflektion och Java tillåter reflektion att Java, som är designat för att skrivas statiskt, kan skrivas dynamiskt. Dynamiskt skrivande är inte i sig av ondo. Ja, det tillåter programmeraren att bryta vissa OOP-principer, men samtidigt tillåter det många kraftfulla funktioner som runtime proxying och beroendeinjektion. Ja, Java låter dig skjuta dig själv i foten med reflektion. Men du måste mycket tydligt rikta pistolen mot din fot, ta av säkerheten och dra avtryckaren”, förklarar Jayesh Lalwani, en erfaren Java-programmerare och applikationsarkitekt.

6. In-/utgångsströmmar

Strömmar låter dig arbeta med vilken datakälla som helst: Internet, din dators filsystem eller något annat. Strömmar är ett universellt verktyg. De tillåter ett program att ta emot data var som helst (indataströmmar) och skicka dem var som helst (outputströmmar). Deras uppgift är densamma: att ta data från en plats och skicka den till en annan. Det finns två typer av strömmar: ingångsströmmar (används för att ta emot data) och utströmmar (för att skicka data). Det som gör det svårt för många människor att förstå att använda strömmar är det faktum att Java har flera I/O-strömklasser.

Tips och rekommendationer

"Java har så många I/O-strömklasser främst på grund av två bidragande faktorer. Först är arvet. Vissa klasser finns fortfarande kvar av historiska skäl och de är inte utfasade eftersom de inte anses vara skadliga. För det andra, flexibilitet. Olika applikationer har olika krav och därför har du flera alternativ beroende på dina krav. Användbara abstraktioner ger klarhet när du läser den och med få rader kod kan du göra mycket”, säger Jonas Mellin, Java-expert från Sverige. Vilka aspekter av Java tyckte du var svårast att förstå eller har fastnat för en tid? Dela dina erfarenheter i kommentarerna.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION