Qeyd: Real imtahan suallarını paylaşmaq leqal hesab edilmir. Ona görə də aşağıdakı yazıda imtahana istinadən paylaşdığım kod nümunələri dəyişdirilmiş və bənzər kodlarla əvəz edilmişdir.
1) 2 sualda iki variant arasında qalmışdım, seçim etməkdə çətinlik çəkirdim.
1-ci sual Wrapper`lə bağlı idi. Təxminən belə bir şey soruşulurdu:
public static void main(String[] args) { int i1 = Integer.parseInt(args[0]); boolean b1 = Boolean.parseBoolean(args[0]); System.out.println(i1 + " " + b1); int i2 = Integer.valueOf(args[0]); boolean b2 = Boolean.valueOf(args[0]); System.out.println(i2 + " " + b2); }
parseXXX()
metodları ilə bağlı problem yox idi, çünki geriyə primitive dəyər qaytarır. Amma valueOf()
metodu geriyə Reference dəyər qaytarır, fikirləşdim bəlkə compile xətası verər, gərək sonunda intValue()
də olsun: Integer.valueOf(args[0]).intValue();
Amma sonra fikirləşdim intValue()
metodunu çağırmağa ehtiyac yoxdu, Integer.valueOf(args[0]);
avtomatik olaraq unboxing vasitəsilə primitiv tipə mənimsədilə bilir. Gələn kimi yoxladım, doğru yazmışdım.
2-ci sual isə lambda ilə əlaqəli idi. Ümumiyyətlə mən lambda mövzusunu çox yaxşı mənimsəmişdim, testlərdə də lambda ilə bağlı əksər sualları doğru tapırdım, bilmədiyim bəzi şeyləri də Enthuware`dən öyrənmişdim. Amma imtahanda qarşıma çıxan lambda sualına bənzər nümunə nə SYBEX, nə də Enhtuware`də qarşıma çıxmamışdı, kifayət qədər çətin sual idi mənə görə. İmtahanın nəticəsi çıxanda, orada həmçinin səhv etdiyiniz sualların hansı mövzuya aid olması ilə bağlı feedback də göndərilir. Feedback`də 3 mövzu qeyd olunmuşdu, həmin mövzulardan biri də lambda idi. Lambda ilə bağlı cəmi bir sual düşdüyündən bildim ki, həmin sualdı. Sual isə təxminən aşağıdakı nümunəyə bənzər sual idi:
String names[] = {"Roel", "Jeanne", "Paul", "Mushfiq"}; List<String> list = new ArrayList(Arrays.asList(names)); if(list.removeIf( (String s) -> { return s.contains("s"); } )){ System.out.println(s + " removes"); }
asList()
ilə removeIf()
metodunu bir yerdə görüncə ilk ağlıma gələn o oldu ki, bu kod UnsupportedOperationException
fırladacaq, çünki Arrays.asList()
ilə yaradılan list “fixed size list” hesab olunur və onun ölçüsünü nə artırmaq, nə də azaltmaq mümkün deyil. Amma həmin cavabı seçməzdən öncə lambda ifadəsinin sintaksisinin doğru olub olmadığını yoxladım, çünki hazırlıqlardan belə başa düşmüşdüm ki, lambda ilə əlaqəli əksər suallar sintaksis ilə bağlı suallardır. removeIf()
metodu Predicate
interfeysi tipində parametr qəbul edir və:
- parametrin tipi aşkar şəkildə göstərilib (
String
) və buna görə də mötərizə olmalıdır və var; - parametr siyahısı ilə gövdəni birləşdirən ox (arrow) var;
- geriyə boolean dəyər qayıtmalı, return ifadəsi yazıldığına görə nöqtəli-vergül, fiqurlu mötərizə olmalıdır və var.
Sintaksisdə hər şey qaydasında olduğuna əmin olduqdan sonra “throws UnsupportedOperationException” cavabını seçdim. Amma sonda ümumu suallara təkrar bir də nəzər keçirəndə hardasa oxuduğumu xatırladım ki (amma harada onu xatırlaya bilmədim), new ArrayList()
ilə yaradıldığına görə bu list “fixed size” hesab olunmur, ona görə də qərara gəldim ki, bu kod exception fırlatmır və “Mushfiq removes” cavabını seçdim. Amma bu kodu imtahandan qayıtdıqdan sonra IDE`də test edəndə gördüm ki, gözümdən qaçan, diqqətdən yayınan başqa bir məqam da var imiş. Sintaksis olaraq mən ancaq 7-ci sətiri yoxlamışdım, amma compile xətası 8-ci sətirdə idi. Lambda ifadəsinin parametr listində elan edilmiş dəyişən ancaq lambda ifadəsinin gövdəsində işlədilə bilər, 8-ci sətirdə s
dəyişəninə müraciət etmək mümkün deyil. Cavab “complation fails” olmalı idi.
2) İki sualın isə quruluşu qəribə və mürəkkəb idi.
1-ci sual import ilə bağlı idi. Təxminən belə bir sual:
A
adında bir proyektimiz var, B
və C
paketlərindən ibarətdir.
package B; public class ClassB {} package C; public class ClassC {}
ClassC
-nin ClassB
-nin daxilində istifadə edilə bilməsi üçün hansı importlar tələb olunur? Doğru sinkatisə malik ikisini seçin (təqribən):
A. String name = ClassC.getName();
B. import A;
C. import C.ClassC;
D. import B.ClassB;
E. String name = C.ClassC.getName();
Tələb olunan import bircə C bəndidir. Amma 2 cavab seçilməli olduğuna görə digər münasib cavab kimi D-ni seçdim. D sintaksis olaraq doğru import-dur, amma tələb olunmur, onun yazılmasına ehtiyac yoxdur. Əgər getName()
metodu static olsa idi, E bəndi doğru olardı. Lakin getName()
metodu ilə bağlı heç bir informasiya yox idi. Həmin vaxtı Coderanch forumunda Roel`in yazdığı bu sözlər yadıma düşdü: “You should never assume something which is not mentioned in the question or in the option”. Ona görə də C və D seçmişdim. Amma sual dəqiqliklə yadımda deyil, təxmini buna bənzər bir şey idi.
2-ci sual isə this()
və super()
constructorlarla bağlı idi. Məzmununa görə Enthuware Standart Test 5, sual 44`ə bənzəyirdi, amma quruluşuna görə çox mürəkkəb idi. Həcmi çox böyük idi, ekrana sığışmırdı, sualı tam şəkildə görmək üçün scrolla aşağı sürüşdürmək lazım idi. Səhv etmirəmsə scrolla ehtiyac olan yeganə sual idi.
Feedback`ə əsasən səhv etdiyim suallardan birinin lambda ilə əlaqəli sual olduğunu bildim. Amma səhv cavablandırdığım digər 4 sualın hansılar olduğu hələ də mənim üçün maraqlı olaraq qalır 🙂