Потоки ввода-вывода. работа с файлами

Приложения от разработчиков для разработчиков

Разработчики себя не обидят, поэтому пишут приложения для собственной работы с помощью лучших инструментов;). Вот где Java-программисты разгулялись не на шутку: на этом языке написано огромное количество известных и самых лучших приложений, которые используются в процессе разработки ПО. Например, известные IDE и текстовые редакторы — Eclipse, IntelliJ IDEA, NetBeans, RubyMine, Aptana. Система отслеживания ошибок и взаимодействия с пользователями Jira, система для документирования и создания базы знаний Confluence. Также Java хорошо проявила себя в работе с Big Data: на ней написан проект Hadoop, созданный для разработки и выполнения распределенных приложений, работающих на кластерах.

Что еще?

Да уйма всего, на самом-то деле. Вот еще несколько примеров из разных опер:

OpenOffice — офисный пакет, кросс-платформенный, универсальный.

BookSmart — бесплатное приложение для создания книг и фотоальбомов.

UltraMixer — софт для диджеев.

MATLAB — платформа вместе с средой разработки и языком для научных вычислений. Написан на Java и C.

ImageJ — приложение с открытым кодом для анализа и обработки изображений.

LWJGL — под этой страшной аббревиатурой скрывается библиотека для работы с OpenGL. Она рассчитана на тех программистов, которые хотят делать игры под Java.

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

NetBeans Platform — Java-фреймворк, на котором написана масса «тяжелых» Enterprise-приложений, например, Nato MICE Console или Boeing Mass Properties Toolkit.

Как создать класс в Java

Теперь можно приступить к созданию классов. Начнём с пользователя:

Слово public выступает модификатором доступа — он определяет, откуда будет доступен компонент. Для класса можно указать следующие модификаторы:

  • public — доступно в любых частях программы (применимо и к другим компонентам);
  • default — доступно только классам из того же пакета.

Теперь в основном файле можно создать объект класса User:

Мы указали для объекта user1 класс User, а после оператора присваивания указали ключевое слово new и запустили конструктор (об этом позже). Вот как будет выполнена программа:

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

Для этого нужно в теле класса создать метод с таким же названием, что и класс. Ему можно передать аргументы, с которыми можно провести операции:

Обратите внимание, что внутри класса атрибуты вызываются с помощью ключевого слова this. Это нужно для того, чтобы компилятор не путался, с какой переменной работать — например, в случае, если у аргумента такое же имя, как и у атрибута:. Теперь, чтобы создать объект, нужно немного поменять код:

Теперь, чтобы создать объект, нужно немного поменять код:

Дальше можно создать класс для работы с сообщениями:

Обратите внимание, что в этот раз для атрибутов from и to мы задали модификатор private, а в качестве типа стоит User. Private позволяет закрыть доступ к элементам извне — то есть их можно менять только внутри методов самого класса

Это позволяет защитить атрибуты от незапланированного доступа. Если же вы хотите получать или менять атрибуты, можно воспользоваться getter и setter. Это специальные методы, которые позволяют обратиться к защищённой переменной:

Теперь можно написать код, который будет создавать сообщение:

Вот как это работает:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Enterprise: мнимая «невидимость» Java

Такая ситуация сложилась потому, что Java остается невидимой с точки зрения пользователя. Она тихо выполняет свою работу, порой весьма сложную. Если диспетчер следит за движением самолётов и системой жизнеобеспечения аэропорта на мониторе своего компьютера, скорее всего, внутреннюю работу, всё это отслеживание позиций, регулировку, отсылку предупреждений выполняет Java. Распределенные системы для покупки билетов, банковские системы, через которые проходят миллиарды, программы для электронной коммерции? Java. Приложения, управляющие работой бизнеса или людьми в компании, — то, что скрывается за аббревиатурами CRM, ERP? Эти гигантские и сложные программы тоже очень часто написаны на Java. По сути везде, где есть распределенный средний и крупный бизнес, ищи Java.

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

Большие веб-приложения «для людей»

Пользователи часто не осознают, что за симпатичным фасадом сайта, которым они пользуются, может стоять огромное приложение, требующее сотни тысяч человеко-часов на разработку и поддержку. Очень часто сложную (или «грязную») работу выполняет Java. Большие сайты практически не бывают монолитами, использующими только один язык или технологию для бек-энда (той части сайта, которая выполняется на сервере, back-end явным образом пользователю не виден). Доля Java-кода ощутима, в частности, в следующих веб-приложениях:

Ebay — в основе архитектуры крупнейшего интернет-аукциона лежит именно Java;

социальная сеть Linkedin, та, которая для деловых контактов, преимущественно написана на Java;
Корпорация Добра, то бишь, активно использует Java в разработке таких сервисов, как Google Plus или GTalk;

. История этого приложения начиналась вовсе не с Java, а с Ruby on Rails. Это такой фреймворк, который триумфально выходит на сцену, когда необходимо создать сложное веб-приложение очень быстро. Так было и с Twitter. Однако разработчики не учли лавинообразно растущую популярность этого незамысловатого сервиса, из-за которой стала проседать производительность. Пришлось переписывать важные его части на языке, который лучше масштабируется — на Java;

. Долгое время самая популярная социальная сеть оставалась адептом языка PHP, что большая редкость для «гигантов». Этот язык, удобный для небольших сайтов, представляет собой большую проблему, если те начинают расти. На самом деле, и сегодня Facebook до сих пор остается PHP-шной вотчиной к вящей радости почитателей этого языка. Тем не менее, если присмотреться к Facebook изнутри, там можно найти ростки Java и множества других языков. Например, сайт использует HBase (это основанная на Java база данных) в качестве платформы для мессенджера. А масштабируемым сервисом для разработки служит такая интересная штука, как Apache Thrift. Этот программный конвейер с движком генерации кода для разработки служб работает, в частности, с Java.

Интерфейс Map и класс HashMap

Последнее обновление: 25.04.2018

Интерфейс Map<K, V> представляет отображение или иначе говоря словарь, где каждый элемент представляет пару «ключ-значение». При этом
все ключи уникальные в рамках объекта Map. Такие коллекции облегчают поиск элемента, если нам известен ключ — уникальный идентификатор объекта.

Следует отметить, что в отличие от других интерфейсов, которые представляют коллекции, интерфейс Map НЕ расширяет интерфейс Collection.

Среди методов интерфейса Map можно выделить следующие:

  • : очищает коллекцию

  • : возвращает true, если коллекция содержит ключ k

  • : возвращает true, если коллекция содержит значение v

  • : возвращает набор элементов коллекции. Все элементы представляют объект

  • : возвращает true, если коллекция идентична коллекции, передаваемой через параметр obj

  • : возвращает true, если коллекция пуста

  • : возвращает значение объекта, ключ которого равен k. Если такого элемента не окажется, то возвращается значение

  • : возвращает значение объекта, ключ которого равен k. Если такого элемента не окажется,
    то возвращается значение

  • : помещает в коллекцию новый объект с ключом k и значением v. Если в коллекции уже есть объект с подобным ключом,
    то он перезаписывается. После добавления возвращает предыдущее значение для ключа k, если он уже был в коллекции. Если же ключа еще не было в коллекции,
    то возвращается значение

  • : помещает в коллекцию новый объект с ключом k и значением v, если в коллекции еще нет элемента с подобным ключом.

  • : возвращает набор всех ключей отображения

  • : возвращает набор всех значений отображения

  • : добавляет в коллекцию все объекты из отображения map

  • : удаляет объект с ключом k

  • : возвращает количество элементов коллекции

Чтобы положить объект в коллекцию, используется метод , а чтобы получить по ключу — метод . Реализация интерфейса
Map также позволяет получить наборы как ключей, так и значений. А метод возвращает набор всех элементов в виде объектов
Map.Entry<K, V>.

Обобщенный интерфейс представляет объект с ключом типа K и значением типа V и определяет следующие методы:

  • : возвращает true, если объект obj, представляющий интерфейс , идентичен текущему

  • : возвращает ключ объекта отображения

  • : возвращает значение объекта отображения

  • : устанавливает для текущего объекта значение v

  • : возвращает хеш-код данного объекта

При переборе объектов отображения мы будем оперировать этими методами для работы с ключами и значениями объектов.

Классы отображений. HashMap

Базовым классом для всех отображений является абстрактный класс AbstractMap,
который реализует большую часть методов интерфейса Map. Наиболее распространенным классом отображений является HashMap,
который реализует интерфейс Map и наследуется от класса AbstractMap.

Пример использования класса:

import java.util.*;

public class Program{
     
	public static void main(String[] args) {
         
        Map<Integer, String> states = new HashMap<Integer, String>();
       states.put(1, "Germany");
       states.put(2, "Spain");
       states.put(4, "France");
       states.put(3, "Italy");
        
       // получим объект по ключу 2
       String first = states.get(2);
       System.out.println(first);
       // получим весь набор ключей
       Set<Integer> keys = states.keySet();
       // получить набор всех значений
       Collection<String> values = states.values();
       //заменить элемент
       states.replace(1, "Poland");
       // удаление элемента по ключу 2
       states.remove(2);
       // перебор элементов
       for(Map.Entry<Integer, String> item : states.entrySet()){
        
           System.out.printf("Key: %d  Value: %s \n", item.getKey(), item.getValue());
       }
         
       Map<String, Person> people = new HashMap<String, Person>();
       people.put("1240i54", new Person("Tom"));
       people.put("1564i55", new Person("Bill"));
       people.put("4540i56", new Person("Nick"));
        
       for(Map.Entry<String, Person> item : people.entrySet()){
        
           System.out.printf("Key: %s  Value: %s \n", item.getKey(), item.getValue().getName());
       }
    }
}
class Person{
     
    private String name;
    public Person(String value){
         
        name=value;
    }
    String getName(){return name;}
}

Чтобы добавить или заменить элемент, используется метод put, либо replace, а чтобы получить его значение по ключу — метод get. С помощью других методов
интерфейса Map также производятся другие манипуляции над элементами: перебор, получение ключей, значений, удаление.

НазадВперед

3.2 Папка src

В Java принято все классы одной программы хранить в одной папке (и ее подпапках). Такую папку обычно называют (сокращение от source).

Такая папка называется корнем проекта (source root), и все пути для пакетов считаются от нее. Примеры:

Папки Имя пакета

Программисты в такой ситуации скажут что-то типа «у нас есть проект по имени , который расположен в папке » или «у нас есть проект по имени , который расположен в папке »

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

В Java принято давать классам и пакетам осмысленные имена. Многие компании выпускают свои библиотеки (набор классов) и, чтобы не было путаницы, называют пакеты этих классов по имени компании/сайта/проекта:

Имя пакета Имя компании/проекта
org.apache.common
org.apache.tomcat
org.apache.util
Проект «Apache»
com.oracle.jdbc Компания «Oracle»
java.iojavax.servlet Компания Oracle, проект Java
com.ibm.websphere Компания «IBM», проект WebSphere
com.jboss Проект «Jboss»
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector