Я раньше не читал книг по Джаве для новичков. Исправляюсь.
Главный плюс книги — милые картинки.
Имеется годное введение в JavaFX. Объясняется, как строить UI с помощью FXML и из Java-кода. Немного CSS. Кроме обычных UI-компонентов используются и примитивные фигуры. Вообще, умение делать GUI — довольно приятный навык, потому что результат своего труда можно «пощупать».
Правда, при написании крестиков-ноликов автор создаёт поле 3×3 copy-paste'ом, им же проверяет выигрышные комбинации, а стиль сфокусированной кнопки подавляет жутким костылём. В итоге она всё равно выглядит немного иначе, чем остальные.
В качестве IDE используется IntelliJ — то есть ровно та, которая попадётся вам на работе. В ней же написана эта статья.
Лайк за введение в джавовую сериализацию, но не хватает описания её минусов. Лайк за упоминание IPv6-адресов, не IPv4 единым. Лайк за введение в Git и GitHub.
Сама Джава же дана в совершенно ужасном качестве. Далее привожу цитаты из книги со своими комментариями.
the same Java program can run on different devices
Довольно несвежий довод. Программы на других языках тоже так могут, просто с другими оговорками.
the software required to write Java is free
Эра SmallTalk давно прошла. Все популярные языки бесплатны, платные давно исчезли с радаров.
public class HelloWorld{
int currentDepth=0;
process_key_Up();
Весь код в книге отвратительно отформатирован.
One data type for storing a single character values – char.
Опасное заблуждение. char — не code point, не символ, не графема. Это просто пара байт, символ может в них влезть, а может не влезть.
If you declare, but won’t initialize primitive variables, Java will do it for you by assigning zero
Правдиво для полей, но не для локальных переменных.
In Java we usually name final variables using capital letters
Нет! Это только про константы, static final. Вообще, значение final не раскрыто, а многие effectively final поля не отмечены как final.
Only one bit is required to store the value of boolean variable.
Но мы-то знаем...
This is what inheritance is all about – you do not have to copy and paste code from the class Pet – just use the keyword extends, and the class Fish can use Pet’s methods!
Конечно, любую языковую возможность, в т. ч. наследование, нужно знать и уметь применять. Но здесь поддерживается неверная тенденция использовать наследование повсюду.
Arrays are marked by placing square brackets either after the variable name, or after the data type:
Научили и хорошему, и плохому. Одним махом. Кстати, рекомендую в IntelliJ включить инспекцию «C-style array declaration», чтобы «плохой» вариант Type variable[]; подсвечивался предупреждением.
If it’s F, the temperature has to be converted to Fahrenheit, and if it’s C, convert it to Celsius.
FROM WHAT? У автора очень плохо с единице-измерения-безопасностью: физические величины не представляются ни в виде отдельных типов, оборачивающих примитивы, ни даже в именах переменных. Хороший пример типобезопасных единиц измерения — доклад The Power of Types by Danny Preussler.
a special group of programming languages that are called functional (e.g. JavaScript, Scala et al)
Это же чудовища-гибриды. Истинно функциональные языки — Erlang, Haskell, OCaml, Clojure, F#.
Java 8 introduced a new keyword default.
Строго говоря, ключевое слово присутствует и в первой версии. В восьмёрке добавились новые его применения.
Interfaces can’t have instance methods
Что я только что прочитал?! Как это понимать?
to implement any behavior you’d write a method that could be invoked by specifying (...) the object variable and a method name
Технически некорректно. Чтобы вызвать метод на объекте, не обязательно иметь переменную (variable.method()), подойдёт любое выражение объектного типа: something().method(), new Some().method().
Java collections - the language elements
Коллекции — части stdlib, JDK, но никак не языка.
But who do you need to hide or protect the code from? This is not a protection from bad guys who are not allowed to see your code. You hide and protect the code from misuse.
Очень хорошее высказывание. Модификаторы видимости про защиту не от взлома, а от неправильного использования.
new Hashtable();
Нет, пожалуйста, нет! Если бы не обратная совместимость, этот класс давно удалили бы.
If you’ll add it to the same collection under the same key - friends.put("Art", friend3); it’ll replace the contact details of the first Art with the data of the second one. This happens because Java Hashtable internally generates a hash key (the number) from your key and uses it as an index to find the element when need be. The same names will generate the same hash keys.
Выглядит как полное непонимание контракта Map и незнание самого факта существования алгоритмов разрешения коллизий. Последующие Map#put с тем же ключом заменяют предыдущие значения не потому что хэш ключа одинаковый, а потому что ключ одинаковый.
By the way, ArrayList even allows you to store duplicates (objects with the same values) while Hashtable doesn’t.
В качестве ключей — действительно не позволит. В качестве значений — сколько угодно. Кстати, equals в книге встречается только в контексте сравнения строк, а hashCode не встречается ни разу.
Subclasses of the class Error are fatal JVM errors and the running program can’t handle them.
Неправда, никто не запретит обрабатывать Error'ы: try { new byte[100500]; } catch (OutOfMemoryError e) {}
the method getScores will re-throw this exception to its caller.
Не re-throw, а propagate, но этот термин автор вводит позже.
This is an example of a bad style of Java coding. When you write a program, always remember that someone else may read it, and you don’t want to be ashamed of your code.
«Делайте так, чтобы не стыдно было показать другим». А о том, за что же там должно быть стыдно, не сказано ни слова.
we open the file for reading (using a default character set)
Он открывает бинарный InputStream, а не символьный Reader, так что никакой кодировки там нет.
standard character sets for English-speaking people are US-ASCII, UTF-8, and UTF-16.
UTFы — это реализации Юникода, там все известные мне живые письменности и даже несколько исторических.
Two backslashes in a Java string correspond to one backslash in the Windows operational system.
Нет, два бэкслэша в литерале — это один бэкслэш в результирующей строке. То, что это используется в путях в Windows, не имеет никакого отношения к синтаксису языка.
every request should include a request header
Путает заголовки HTTP с первой строкой запросов и ответов, которые имеют особый формат.
is not a class or an interface, but a special Java construct called enum
enum — частный случай класса, так что нельзя сказать, что он не класс.
git reset HEAD
The reset command will undo the last commit and will open a text editor containing the description of this reverted commit, which can look as follows:
Revert "modified the opening comment in PetMaster.java"
Путает ресет и ревёрт?
Благо, редактировать онлайн-книгу гораздо проще, чем бумажную, которая уже вышла в тираж. Если автор опомнится и перестанет игнорировать Issues и Pull Requests в своём гитхабе, все эти проблемы можно будет исправить — было бы желание.