ДжавиранеПубликувано / posted 2009-10-16 в категория / in category: Java
|
Тази седмица я посветих на учене/припомняне на Java. Отдавна не бях я пипвал и съответно, общо взето, се наложи да започвам от А и Б. Първият проблем беше да си намеря читава книга. Тези, които съм купувал и използвал преди бяха много стари, още от времето когато Swing-a беше нова екзотика. Както и очаквах -- наложи се да сваля и прегледам 10-ина книги (god bless thepiratebay.org) преди да намеря една, която, не само е читава, ами и да отговаря на префинения ми вкус ;-). В крайна сметка се спрях на Core Java 8th Edition -- авторите са hardcore джависти, отделно имат опит със C++ и дават много добри сравнения между двата езика, отделно -- имат чувство за хумор. Няма разводняване с разни глупави и прекалено обширни примери -- всичко е написано с мярка и на място (е, все пак е 8-мо издание, имах-си-хас).
Причината да започна отново да разучавам Java-та е, че PHP-то нещо ми отесня съвсем. Общо взето достигнах до ранг "Скакауец" с девиз: "Мене жокер ми не требе, я това си го знам". Отделно ми поомръзна.
Бях забравил каква е тръпката (трътката) от ученето на "нов" език. Голям кеф е човек да си поизпържи мозъка с нови концепции и най-вече да трябва да го огъва и усуква, за да ги възприеме, въпреки наличието на стари, които са подобни и в същото време различни.
Известно време се колебаех дали да не се върна към любимия ми C++, но следните съображения надделяха в полза на Java-та:
- Android -- всъщност това е основното изкушение. Според мен в близките една-две години това ще е новия хит (от тип "Еврибари на магари") и той ще се задържи такъв поне 5-6.
- Има повече и по-разнообразна работа за Java програмисти. От кариеристична гледна точка това за мен е важно.
- срам не срам трябва да призная, че C++ ми идвам прекалено сложен. То не се знае дали и Java-та няма да ми дойде в повечко -- все пак вече съм стар човек (кхъ-кхъ, къде ми е бастуна (bugah-bugah-bugah!!! Stupid dog! You make me look bad.)). Не на последно място -- човек не трябва да си прави илюзии, че (ще) разбира от C++ ако не изглежда точно така:
:-)
По закона на всеобщата гадост почти веднага успях да се нахендря на бъг в Java-та, заради който изгубих половин ден чудейки се: Абе наистина ли е бъг или просто аз съм тъп?
Ето го:
{ Locale.setDefault(new Locale("bg", "BG")); String[] weekDays = new DateFormatSymbols().getWeekdays(); GregorianCalendar g = new GregorianCalendar(); System.out.println(weekDays[g.getFirstDayOfWeek()]); }
Е това горното трябва да изкара "Понеделник", а то изкарва "Неделя". Явно Locale-а за България е бъгав и first getFirstDayOfWeek() връща 1 вместо 2 (всичко е заради извратените американци, при които седмицата започва с Неделя (wft?! oh well…)).
Изключително лошо впечатление ми направи, че като търсех в Google за този проблем нямаше нито един постинг на български, все едно, тук никой не се е нахендрял на него. Всъщност, същият проблем съществува с Locale-ите на всички източно европейски страни, но само един унгарец го е постнал като бъг в бъгтракера на Java.
Друг шит -- getWeekdays връща масив с празен елемент [0]. Все едно нарочно са го направили, за да е първия ден с индекс 1 и да е по-удобно (на кОго?!). Странна работа…
Въобще, като четох книгата явно има не една и две недомислици в джавата, като най-значимата е, че член-променливите в клас получават по подразбиране access level package (вместо private), но това си е омазано от самото начало…
Както и да е, ще я боря Java-та. Да видим какво ще излезе…
|
Датите и календарите в Java са отврат, трябва да се примириш с това и да свикнеш на десетките странности. Ако си имал шанса да работиш с дати в C#, ще ти трябва много време да си изкривиш мисленето след това :) Но виж, на мен и php-ските time() и date() функции са ми странни по своему.
Locale-ът си работи -- ако го смениш на еn, EN, ще ти оправи езиковите (и не само) настройки. Но досега не съм срещал никога DateFormatSymbols класа, честно казано.
За модификаторите за достъп -- по подразбиране имаш default модификатор, който е различен от private, protected и public. Според мен не е непременно лоша идея -- лесно за наследяване и преизползване за някои членове, а според практиките на капсулацията в ООП по подразбиране задаваш private на всички полета, след което ги капсулираш с get/set методи с public или protected модификатори.
Да, en_UK дава правилния ден за getFirstDayOfWeek, но пък там символите за хиляди и десетичния разделител май бяха не както трябва за BG.
Прав си за модификаторите, че трябва сам да си ги дадеш private, но точно това е проблемът -- ако забравиш модификатора поради невнимание и достъпът става package което си е опасно. Един от примерите, който дават в Core Java е с класа Window -- има бая член-променливи, които са оставени без модификатор.
А за датите: блах, в сравнение с PHP-то, където, едва ли не, всичко трябва да си правиш сам, Java-та ми изглежда като магазин с промоция "Вземате безплатно всичко, което можете да носите" :-). Както се казва: "На харизан кон зъбите не се гледат" :-)
Ами, така е -- изцяло OOP базиран език с крайна класова структура, хубави IDE-та с рефакторинг, autocomplete и други благинки, добре дефинирано API, все хубави работи. Грешките са ясни и недвусмислени и изхвърчат още compile-time. Няма как да не е по-приятно за писане от скриптовите езици :)
Аз наистина не виждам проблем с това да \'забравиш\' да сложиш private -- може би си свикнал от C++, че всичко е private по подразбиране, но в С пък структурите са public по подразбиране да речем. Някъде е удобно (и по-бързо) да се обръщаш директно към полето в наследниците ,вместо да минаваш през property методи.