Операторы java

6.6* Другие методы класса Scanner

Это, кстати, были не все методы класса . Полный список будет выглядеть примерно так:


Метод Описание
Считывает данные и преобразует их в тип
Считывает данные и преобразует их в тип
Считывает данные и преобразует их в тип
Считывает данные и преобразует их в тип
Считывает данные и преобразует их в тип
Считывает данные и преобразует их в тип
Считывает данные и преобразует их в тип
Считывает одно «слово». Слова разделяются пробелами или enter
Считывает целую строку

Есть еще методы, которые позволяют проверить тип еще не считанных данных (чтобы знать, каким методом их считывать).

Метод Описание
Там тип ? Его можно будет преобразовать к ?
Там тип ? Его можно будет преобразовать к ?
Там тип ? Его можно будет преобразовать к ?
Там тип ? Его можно будет преобразовать к ?
Там тип ? Его можно будет преобразовать к ?
Там тип ? Его можно будет преобразовать к ?
Там тип ? Его можно будет преобразовать к ?
Там есть еще одно слово?
Там есть еще одна строка?

Подробнее о выражениях switch

И последнее, но не менее важное — особенности использования в качестве выражения:

  • множественные выражения;
  • ранний возврат (досрочный );
  • охват всех значений.

Обратите внимание, что при этом не имеет значения, какая форма используется!

Множественные выражения

Switch-выражения являются множественными выражениями. Это означает, что они не имеют своего собственного типа, но могут быть одним из нескольких типов. Наиболее часто в качестве таких выражений используются лямбда-выражения: , могут быть , но также могут быть или .

С помощью switch-выражений тип определяется по взаимодействию между тем, где используется switch и типами его веток. Если switch-выражение назначается типизированной переменной, передается в качестве аргумента или иным образом используется в контексте, где известен точный тип (это называется целевым типом), то все его ветки должны соответствовать этому типу. Вот что мы делали до сих пор:

Как итог — присваивается переменной типа . Следовательно, является целевым типом, и все ветки должны возвращать результат типа .

То же самое происходит и здесь:

А что произойдет сейчас?

(Про использование типа var читайте в нашей прошлой статье 26 рекомендаций по использованию типа var в Java — примечание переводчика)

Если целевой тип неизвестен, из-за того, что мы используем var, тип вычисляется путем нахождения наиболее конкретного супертипа из типов, создаваемых ветками.

Ранний возврат

Следствием различия между выражением и оператором является то, что вы можете использовать для выхода из оператора :

… вы не можете использовать внутри выражения …

Это имеет смысл независимо от того, используете ли вы стрелку или двоеточие.

Покрытие всех вариантов

Если вы используете в качестве оператора, тогда не имеет значения, охвачены все варианты или нет. Конечно, вы можете случайно пропустить , и код будет работать неправильно, но компилятору все равно — вы, ваша IDE и ваши инструменты анализа кода останетесь с этим наедине.

Switch-выражения усугубляют эту проблему. Куда следует перейти , если нужная метка отсутствует? Единственный ответ, который может дать Java — это возвращать для ссылочных типов и значение по умолчанию для примитивов. Это породило бы множество ошибок в основном коде.

Чтобы предотвратить такой исход, компилятор может помочь вам. Для switch-выражений компилятор будет настаивать, чтобы все возможные варианты были охвачены. Давайте посмотрим на пример, который может привести к ошибке компиляции:

Интересным является следующее решение: добавление ветки , конечно, исправит ошибку, но это не является единственным решением — еще можно добавить для .

Да, компилятор наконец-то сможет определить, охватываются ли все значения enum (исчерпывают ли все варианты), и не установить бесполезные значения по умолчанию! Давайте посидим минуту в безмолвной благодарности.

Хотя, это все же вызывает один вопрос. Что делать, если кто-то возьмет и превратит сумасшедший Bool в кватернионный Boolean, добавив четвертое значение? Если вы перекомпилируете switch-выражение для расширенного Bool, то получите ошибку компиляции (выражение больше не является исчерпывающим). Без перекомпиляции это превратится в проблему во время выполнения. Чтобы отловить эту проблему, компилятор переходит в ветку , которая ведет себя так же, как та, которую мы использовали до сих пор, вызывая исключение.

В Java 12 охват всех значений без ветки работает только для , но когда в будущих версиях Java станет более мощным, он также сможет работать с произвольными типами. Если метки ‘ов смогут не только проверять равенство, но и проводить сравнения (например _ < 5 -> …) — это позволит охватить все варианты для числовых типов.

6.3 Создание объекта Scanner

Первый вопрос – что это за строка ?

Такая строка может сбивать с толку, однако вы будете постоянно встречать похожие вещи. Так что, думаем, настало время объяснить, что тут написано.

Вспомним, как мы обычно создаем переменную с текстом:

Объявление и инициализация строковой переменной

Сначала мы пишем тип переменной (), затем ее имя () и, наконец, после знака равно пишем значение.

В нашей странной строке на самом деле все то же самое:

Объявление и инициализация переменной типа

Все, что находится слева от знака равно — это объявление переменной типа по имени . Можно было назвать ее, например,  или , или даже . Тогда код выглядел бы так:


Думаю, теперь все стало гораздо понятнее.

А код, что находится справа от знака равно, немного сложнее. Имеется в виду  Но тут тоже ничего космического.

В этом коде мы говорим Java-машине: создай новый объект (слово ) типа  и передай в него в качестве параметра то, из чего новосозданный объект будет брать данные — объект .

После выполнения всей этой строки у нас появится переменная по имени  типа , с помощью которой наша программа сможет считывать данные с клавиатуры.

6.2 Класс Scanner

Класс (полное имя ) умеет считывать данные из разных источников: консоль, файлы, интернет. Если мы хотим, чтобы он считывал данные с клавиатуры, мы должны передать ему объект в качестве параметра – источника данных. А уж объект типа Scanner сам разберется, что с ним делать.

Считывание с клавиатуры с помощью объекта типа будет выглядеть примерно так:

Код Пояснение
Создаем объект класса . Читаем с клавиатуры строку текста. Читаем с клавиатуры число.

Выглядит вроде несложно, но так ли все просто на самом деле?

Думаю, у вас появилась куча вопросов, и сейчас мы на них ответим.

Но для начала продемонстрируем пример полной программы, где используется класс :

6.1 Чтение с консоли, System.in

В предыдущих лекциях мы познакомились с командами вывода на экран. Для этого мы использовали объект , и его методы и . Просто и удобно.

Но, как вы уже наверное догадываетесь, одного вывода на экран недостаточно. Цель большинства программ — сделать что-то полезное для пользователя. Поэтому очень часто нужно, чтобы пользователь мог вводить данные с клавиатуры.

Как и для вывода, для ввода данных тоже есть специальный объект — . Но, к сожалению для нас, он не настолько удобен, как нам бы хотелось. Этот объект позволяет считывать данные с клавиатуры по одному символу за раз.

Поэтому мы воспользуемся еще одним классом, который в паре с объектом даст нам все, что нужно. В Java уже давно есть классы на все случаи жизни. С одним из них мы сейчас и познакомимся.

Анализ первой программы на Java “Hello World”

Ниже приведен краткий анализ этой программы.

  • Язык Java является объектно-ориентированным. В программе на Java приходится манипулировать объектами, чтобы выполнить с их помощью нужные действия. Практически каждый манипулируемый объект принадлежит к определенному классу. В классе определяется назначение объекта. В языке Java весь код определяется в классе. А рассматриваемая здесь программа состоит из единственного класса HelloWorld.
  • Метод main () представляет собой функцию, объявляемую в классе. Это первый метод, вызываемый при выполнении программы. Он объявляется как статический (static), а это означает, что данный метод не оперирует никакими объектами. (Когда метод main () вызывается, имеется совсем немного предопределенных объектов, но ни один из них не является экземпляром класса HelloWorld.) Данный метод объявляется также как пустой (void), а это означает, что он не возвращает никакого значения. Подробнее о назначении объявления параметров String[] args мы обязательно расскажем в дальнейшем.
  • Многие языковые средства Java можно объявлять как открытые (public) или закрытые (private), хотя имеются и другие уровни их доступности. В данном примере класс HelloWorld и метод main() объявляются как public, что наиболее характерно для классов и методов.
  • Пакет состоит из взаимосвязанных классов. Каждый класс целесообразно размещать в пакете, чтобы различать несколько классов с одинаковым именем. Таким образом, полное имя рассматриваемого здесь класса будет следующим: ch0l.sec0l.HelloWorld. Подробнее о пакетах и их условных обозначениях речь пойдет в дальнейших статьях моего блога.
  • Строка кода, начинающаяся со знаков //, содержит комментарий. Все символы от знаков // и до конца строки игнорируются компилятором и предназначены только для чтения человеком, а не машиной.
  • И наконец, рассмотрим тело метода main(). Оно состоит из единственной строки кода, содержащей команду для вывода сообщения в объект System, out, представляющий стандартный поток вывода результатов выполнения программ на Java.

Как видите, Java не является языком написания сценариев, на котором можно быстро написать несколько команд. Этот язык специально предназначен для разработки крупных программ, которые выгодно отличаются организацией в классы и пакеты.

Кроме того, язык Java довольно прост и единообразен. В некоторых языках допускаются глобальные переменные и функции, а также переменные и методы в классах. А в Java все объявляется в классе. Подобное единообразие может привести к несколько многословному коду, но в го же время оно упрощает понимание назначения программы.

Имеется и третий стиль комментария, называемого документирующим. В этом случае комментарий ограничивается разделителями /** и */, как будет показано в следующей части статьи.

1.2 Проектирование программы

Проектирование программы — это целое искусство. Это и просто, и сложно одновременно. Просто, потому что никаких жестких законов нет: все, что не запрещено — разрешено. Ну а сложно тоже по этой причине: очень много способов что-то сделать и непросто найти самый лучший.

Проектировать программу — это как писать книгу. С одной стороны, вы просто пишете буквы, слова, предложения. А с другой – важен сюжет, характеры героев, внутренние противоречия, конфликты, стиль повествования, интрига и т.п.

Главное — понимать, для кого вы пишете код. А код вы пишете для других программистов.

Разработка любого продукта — это внесение изменений: добавили здесь, удалили там, переделали тут. И так маленькими итерациями рождаются большие, огромные и гигантские проекты.

Главное требование к коду — он должен быть понятен другим программистам. Неправильный, но понятный код можно исправить. Правильный и непонятный код улучшать не получится. Его останется только выбросить.

Так как же писать хороший и понятный код?

Для этого нужно делать три вещи:

  • Писать хороший и понятный код внутри методов — самое простое.
  • Решить, какие сущности должны быть в программе
  • Правильно разбивать программу на логические части

Что же стоит за этими понятиями?


Писать хороший код внутри методов

Если у вас хотя бы начальный уровень английского, возможно, вы обратили внимание, как легко иногда читается код: как предложения на английском языке:

  • –  класс Кот расширяет класс ДомашнееЖивотное
  • – пока поток готов …
  • – если а меньше , вернуть , иначе вернуть .

Так сделано специально. Java — один из нескольких языков, в которых легко писать самодокументированный код: код, который понятен без комментариев. В хорошем коде в Java многие методы читаются просто как предложения на английском языке.

Ваша задача при написании кода — тоже делать его максимально простым и лаконичным. Просто думайте, а насколько ваш код будет легко читать, и вы начнете двигаться в правильном направлении.

В Java принято писать легко читаемый код. Желательно, чтобы каждый метод целиком помещался на экран (длина метода — 20-30 строк). Это норма для всего Java-комьюнити. Если код можно улучшить, его нужно улучшить.

Лучший способ научиться писать хороший код — постоянная практика. Пишите много кода, изучайте чужой код, просите более опытных коллег проревьюить ваш код.

И помните, что в тот момент, когда вы себе скажете «и так сойдет», ваше развитие остановится.

Решать, какие сущности должны быть в программе

Вам нужно писать код, понятный для других программистов. Если 9 из 10 программистов при проектировании программы сделают в ней классы A, B и С, то и вам тоже нужно сделать в вашей программе классы A, B, и C. Вы должны писать код, понятный для других.

Отличный, работающий, быстрый, нестандартный код — это плохой код.

Вам нужно изучать чужие проекты: это самый лучший, самый быстрый и самый легкий способ перенять всю мудрость, которая десятилетиями копилась в ИТ-индустрии.

И, кстати, у вас уже есть под рукой отличный, популярный, хорошо документированный проект — Java SDK. Начните с него.

Разбирайте классы и структуры классов. Думайте, почему одни методы сделаны статическими, а другие — нет. Почему у методов именно такие параметры, а не другие. Почему именно такие методы, почему классы называются именно так и находятся именно в таких пакетах.

Когда вы начнете понимать ответы на все эти вопросы, вы сможете писать код, понятный другим.

Однако хочу предостеречь вас от разбора кода в методах Java SDK. Код многих методов был переписан с целью максимизации скорости работы — его читабельность под большим вопросом.

Правильно разбивать программу на логические части

Любую программу обычно разбивают на части или модули. Каждая часть отвечает за свой аспект программы.

Вот у компьютера есть системный блок, монитор, клавиатуры, и это все отдельные, малозависимые части. Более того, их взаимодействие стандартизировано: USB, HDMI и т.п. Зато если вы прольете кофе на клавиатуру, вы можете просто помыть ее под краном, просушить и пользоваться дальше.

А вот ноутбук — это пример монолитной архитектуры: логические части вроде и есть, но интегрированы гораздо сильнее. У MacBookPro, чтобы почистить клавиатуру, нужно разобрать половину ноутбука. А пролитый на ноутбук кофе — повод заказать новый. Только не кофе.

НЕМНОГО БОЛЬШЕ LITE, ЧЕМ SWITCH

Когда вы впервые берете Nintendo Switch Lite в руки, у вас возникает несколько мыслей. Прежде всего, нас охватывает искреннее чувство энтузиазма перед этой консолью в чрезвычайно симпатичном формате, ее компактности и легкости. Затем наступает время вопросов и мелких забот. Но давайте не будем сразу атаковать злые вещи. У нас будет достаточно времени, чтобы разобраться в этом после того, как мы рассмотрим положительные аспекты консоли.

Мы быстро упомянули об этом чуть выше: Switch Lite имеет то преимущество, что он очень легкий. Наша шкала показывает массу 273 грамма без встроенного картриджа против 402 грамма для Switch (с Joy-Con). Размеры этой небольшой консоли также работают в ее пользу: ширина 208 мм при высоте 91,1 мм. Это значительно меньше, чем у первого Switch, в то время как оба устройства имеют одинаковую толщину 13,9 мм.

И отчасти это правда. Увы, пластик, который Nintendo использовала в своем последнем продукте, выглядит слишком дешево. Прикосновение действительно немного грубоватое, но не слишком грубое. Достаточно просто осознать, что мы имеем дело не с высшими качествами. :

То же самое касается клавиш A, B, X и Y. Клавиши Switch Lite действительно полые. В игре это не будет сильно мешать, но в конечном итоге можно задаться вопросом. Вы также должны знать, что эта версия консоли имеет направленный крест в левой части экрана. Само по себе это хорошая новость, особенно для файтингов, где этот элемент важен. Однако “  настоящий  ” контроллер в этом случае всегда будет интереснее.

На Switch Lite разные направления креста не обязательно очень хорошо разделены, что, следовательно, может раздражать самые нервные заголовки. В играх, которые не требуют большой реакции с большим пальцем левой руки, этот крест подойдет. По крайней мере, он намного лучше, чем четыре изолированные левые клавиши на оригинальном Switch.

Что касается триггеров, то они выделяются гораздо больше, чем на классической версии приставки. Это менее красиво, но мне показалось более практичным. Клавиши лучше ложатся под указательный палец, поэтому ими легче пользоваться. Мой единственный вопрос на этом уровне, опять же, касается надежности кнопок. Чрезвычайно легкого пластика там тоже недостаточно, чтобы успокоить полностью. Поэтому мой лучший совет — быть осторожным.

Кроме того, с джойстиками проблем не возникало. Давайте просто вспомним, что у Nintendo Switch были некоторые неудачи на этом уровне, вынуждая некоторых пользователей менять свой Joy-Con. Однако на Switch Lite контроллеры нельзя отсоединить. Так что нам действительно нужно скрестить пальцы, чтобы надеяться, что с этими компонентами не возникнет никаких проблем.


Потому что да, это важный элемент, который нужно знать: Switch Lite можно использовать только в портативном режиме. Вы не можете отсоединить экран от контроллеров или воспроизвести эту консоль на телевизоре с помощью док-станции. В этом смысле Switch Lite можно в некотором роде рассматривать как Game Boy Advance 2019 года… Я сказал «  вроде как  ».

Таким образом, в группе слов “Switch Lite” второй термин гораздо более оправдан, чем первый, призвибитуройкитермин гораздо более оправдан, чем первый, призвибибройкипыпыпибибидодрыпыпитибидодрыпыпыпибибидройки Если вы ищете консоль для гостиной, вы уже можете пойти своим путем. Если вас действительно интересует именно этот аспект ношения, то вы можете найти то, что ищете.

Кроме того, отсутствие Joy-Con обязательно препятствует игре в настольном режиме. Поэтому нет необходимости искать костыль, чтобы консоль стояла вертикально. Кроме того, вы всегда можете доверять порту USB-C для зарядки устройства, а также разъему для порту USB-C для зарядки устройства, а также разъему для зимитисы зитисы для зарядки устройства, а также разъему для зимитисы зновыки

Также знайте, что вам придется попрощаться с тактильной обратной связью. Консольные флюиды исчезли с Joy-Con. Наконец, мы должны еще раз довольствоваться объемом памяти 32 ГБ, из которых 6,2 ГБ уже занято программным обеспечением, на котором работает машина. Покупка microSD почти неизбежна, как и в случае с оригинальным Switch.

Компилирование и выполнение первой программы на Java

Чтобы скомпилировать и выполнить рассматриваемую здесь программу на Java, нужно установить комплект разработки программ на Java под названием Java Development Kit (JDK), а дополнительно, хотя и не обязательно, — интегрированную среду разработки (ИСР). Кроме того, следует загрузить исходный код из данного примера, обратившись на данный веб-сайт. Читать инструкции по установке программного обеспечения неинтересно — их можно найти на том же веб-сайте.

Установив комплект JDK, откройте окно терминала, перейдите к каталогу, содержащему каталог chOl, и выполните приведенные ниже команды. Уже знакомое вам приветствие появится в окне терминала (рис. 1).

Рис. 1. Выполнение первой программы на Java в окне терминала

Обратите внимание на двухэтапный процесс выполнения программы. Сначала по команде javac исходный код Java компилируется в промежуточное представление, называемое байт-кодом, а результат сохраняется в файлах классов

Затем по команде java запускается виртуальная машина, загружающая файлы классов и выполняющая байт-коды.

После компиляции байт-коды можно выполнять на любой виртуальной машине Java, будь то настольный компьютер или вычислительное устройство в далекой галактике. Обещание «написано однажды — выполняется везде» было важным критерием разработки языка Java.

Чтобы выполнить рассматриваемую здесь программу в ИСР (инструментальная среда разработки), нужно сначала создать проект, как поясняется в инструкциях по установке, а затем выбрать класс HelloWorld и дать ИСР команду на выполнение программы. На рис. 2 показано, как это выглядит в Eclipse — распространенной ИСР, хотя имеются и другие отличные ИСР. Освоившись немного с программированием на Java, опробуйте несколько ИСР, чтобы выбрать для себя наиболее подходящую.

Рис. 2. Выполнение первой программы на Java в ИСР Eclipse

Примите поздравления! Вы только что выполнили свою первую программу на Java, следуя освященному временем ритуалу вывода сообщения «Hello, World!”. А теперь можно перейти к рассмотрению основ языка Java.

1.3 Создание своих классов

Но т.к. вы только учитесь программировать, вам нужно начинать с малого — учиться создавать собственные классы.

Вы их, конечно же, уже создавали, но вам нужно учиться понимать, какие классы должны быть в программе, как они должны называться, какие у них должны быть методы. И как они должны друг с другом взаимодействовать.

Список сущностей

Если вы не знаете, с чего начать, начните с начала.

В самом начале проектирования программы вы можете просто выписать на листик список сущностей (объектов), которые должны быть в программе. А потом запрограммировать их по такому принципу: каждая сущность — отдельный класс.

Пример

Допустим, вы хотите написать игру в шахматы. Вам понадобятся такие сущности: шахматная доска и 6 типов фигур. Фигуры ходят по-разному, имеют разную ценность — логично, что это отдельные классы. И вообще, в самом начале, чем больше классов — тем лучше.

Встретить программиста-новичка, который вместо двух классов написал бы десять — большая редкость. Вот вместо десяти написать два, а то и один — это новички любят. Так что больше классов, господа программисты. И ваш код станет понятнее всем, кроме, возможно вас

Шахматы

Допустим, мы решили писать классы для шахмат: как бы эти классы выглядели?

Шахматная доска — это просто массив 8 на 8? Лучше сделайте для нее отдельный класс, который внутри хранит ссылку на массив. Тогда в класс «шахматная доска» вы сможете добавить много полезных методов, которые, например, проверяют, что клетка пустая или занята

В общем, в начале всегда можно руководствоваться принципом: Программа имеет разные Сущности, а у Сущности есть тип. Вот этот тип — это и есть класс.


С этим читают