Введение в программирование на языке JavaИсточник: IBM developerWorks Россия
Оглавление
О данном руководствеО чем данное руководство?Данное руководство знакомит вас с объектно-ориентированным программированием (ООП) с использованием языка Java. Платформа Java - это очень обширная тема, поэтому здесь мы не будем рассматривать ее полностью, но дадим достаточно информации для начала работы с ней. Последующее руководство предоставит дополнительную информацию для работы с Java. Язык Java, естественно, имеет как сторонников, так и противников, но его влияние на индустрию разработки программного обеспечения неоспоримо. Положительная сторона Java состоит в том, что он дает программистам меньше шансов сделать ошибку, чем C++. В нем отсутствуют некоторые наиболее обременительные задачи программирования, например, явное управление памятью, что позволяет программистам сфокусироваться на бизнес-логике. Отрицательная сторона - по канонам ООП язык Java имеет слишком много не объектно-ориентированных элементов, для того чтобы быть хорошим инструментом. Однако, независимо от вашей позиции, знание того, как использовать Java в тех случаях, когда он подходит для выполнения работы, является большим преимуществом. Нужно ли мне это руководство?Данное руководство предназначено для начинающих Java-программистов, которые, возможно, не очень хорошо знакомы с концепциями ООП, или конкретно с Java-платформой. Предполагается наличие общих знаний по загрузке и установке программного обеспечения, общих знаний программных структур и структур данных (например, массивов). Для работы с руководством нужны не более чем поверхностные знания ООП. В данном руководстве будет рассмотрена установка Java-платформы на вашей машине, установка и использование Eclipse, свободно распространяемой интегрированной среды разработки (integrated development environment - IDE), для написания Java-кода. Вы изучите основы программирования на языке Java (в том числе ООП-парадигму и ее применение в Java), синтаксис и использование Java, создание объектов и добавление поведения, работу с коллекциями и обработку ошибок, советы по улучшению кода. К концу руководства вы станете Java-программистом - начинающим, но, тем не мене, Java-программистом. Требования к программному обеспечениюДля выполнения примеров из данного руководства необходимо наличие установленных Java 2 Platform Standard Edition (J2SE) версии 1.4.2 или выше и Eclipse IDE. Не беспокойтесь, если вы еще не установили эти пакеты - мы покажем вам, как это сделать в разделе "Начало работы". Все примеры кода из данного руководства были протестированы с J2SE 1.4.2 на Windows XP. Однако одной из великолепных возможностей платформы Eclipse является то, что она работает практически на всех операционных системах, которые вы можете использовать, в том числе Windows 98/ME/2000/XP, Linux, Solaris, AIX, HP-UX и даже Mac OS X. Начало работыУказания по установкеВ следующих нескольких разделах я в пошаговом режиме рассмотрю процедуру загрузки и установки Java 2 Platform Standard Edition (J2SE) версии 1.4.2 и Eclipse IDE. Первая система дает вам возможность компилировать и выполнять Java-программы. Вторая предоставляет мощную и дружественную среду для написания кода на языке программирования Java. Если Java SDK и Eclipse у вас уже установлены, можете сразу перейти к разделу "Краткая экскурсия по Eclipse" или к разделу "Концепции ООП". Установка Java SDKПервоначальной целью языка Java являлось предоставление возможности для программистов писать одну программу, которая могла бы работать на любой платформе. Эту цель можно выразить афоризмом "Write Once, Run Anywhere" (написать один раз, выполнять везде) (WORA). В действительности все не так просто, но все идет именно к этому. Поддерживают эту цель различные компоненты технологии Java. Платформа Java поставляется в трех редакциях: Standard, Enterprise и Mobile (последние две предназначены для разработки мобильных устройств). Мы буди работать с J2SE, в которую входят все основные библиотеки Java. Все что вам нужно - загрузить и установить ее. Чтобы загрузить J2SE SDK (software development kit - комплект для разработки программного обеспечения), выполните следующие действия:
Все! Теперь у вас есть Java-среда. Следующий шаг - установка интегрированной среды разработки (integrated development environment - IDE). Установка EclipseИнтегрированная среда разработки (IDE) скрывает большинство из рутинных технических подробностей работы с языком программирования Java, поэтому вы можете сконцентрироваться на написании и запуске кода. Только что установленный вами JDK имеет несколько инструментальных средств командной строки, которые предоставляют возможность компилировать и выполнять Java-программы без IDE, но использование этих средств быстро становится головной болью для всех программ, не являющихся слишком простыми. Использование IDE скрывает детали, предоставляет инструменты для ускорения и улучшения работы и просто является более удобным способом разработки программ. Теперь не надо платить за отличную IDE. Eclipse IDE является проектом с открытым исходным кодом, который вы можете бесплатно загрузить и использовать. Eclipse хранит и отслеживает ваш Java-код в файлах, расположенных в вашей файловой системе. Вы можете также использовать Eclipse для работы с кодом, расположенным в CVS-репозитории. Хорошей новостью является то, что Eclipse позволяет вам работать с нужными файлами, но скрывает детали файлов при работе с различными Java-конструкциями, такими как классы (которые мы рассмотрим подробно далее). Загрузить и установить Eclipse просто. Выполните следующие действия:
Все, что осталось - это настроить IDE. Настройка EclipseДля использования Eclipse при написании Java-кода вы должны указать Eclipse, где на вашей машине расположена платформа Java. Выполните следующие действия:
Теперь Eclipse настроен на компилирование и запуск Java-кода. В следующем разделе мы совершим краткую экскурсию по среде Eclipse, для того чтобы вы познакомились с этой программой. Краткая экскурсия по EclipseРабота с Eclipse - это обширная тема, и она, в основном, выходит за рамки данной статьи. Здесь же мы рассмотрим только самое необходимое для знакомства с работой среды Eclipse и ее использованием для Java-разработки. Запустив Eclipse, вы попадаете в перспективу Resource (Eclipse предлагает набор перспектив для вашего кода). Перспектива Resource показывает вашу файловую систему в используемом вами рабочем пространстве Eclipse. В рабочем пространстве хранятся все файлы, относящиеся к Eclipse-разработке. В данное время в вашем рабочем пространстве еще нет ничего, о чем вам нужно беспокоиться. Вообще говоря, Eclipse имеет перспективы, содержащие виды (view). В перспективе Resource вы увидите вид Navigator, вид Outline и др. Вы можете по желанию перемещать эти виды в любую позицию на экране. Eclipse - это неограниченно настраиваемая среда, хотя пока для работы нам достаточно размещения по умолчанию. Но то, что мы видим, не позволяет нам сделать то, что мы хотим. Первым шагом для написания Java-кода в Eclipse является создание Java-проекта. Это не конструкция языка Java; это просто конструкция Eclipse, которая дает возможность организовать ваш Java-код. Для создания Java-проекта выполните следующие действия:
Вы только что создали Java-проект с названием Intro, который вы должны увидеть в виде Navigator в верхнем левом углу экрана. Мы не переключились в перспективу Java после создания проекта потому, что существует более подходящая перспектива для наших текущих целей. Нажмите кнопку Open Perspective в панели в верхнем правом углу окна, затем выберите перспективу Java Browsing. Эта перспектива показывает все, что необходимо для легкого создания Java-программ. При создании Java-кода мы рассмотрим дополнительные функциональные возможности Eclipse для создания, изменения и управления вашим кодом. Но перед этим необходимо рассмотреть некоторые основные концепции объектно-ориентированного программирования, что мы и сделаем в следующем разделе. А сейчас завершим этот раздел рассмотрением интерактивной документации по Java. Интерактивная справка по Java APIИнтерфейс прикладного программирования (application programming interface - API) Java очень объемен, поэтому важно уметь находить нужную информацию. Платформа Java достаточно большая и предоставляет вам практически любое инструментальное средство, в котором вы нуждаетесь как программист. Изучение способов использования этих возможностей может потребовать стольких же усилий, что и изучение механизмов языка программирования. Если вы перейдете на страницу документации по Java фирмы Sun (ссылка приведена в разделе "Ресурсы"), то увидите ссылку на документацию по API для каждой версии SDK. Выберите версию 1.4.2 для просмотра документации. Вы увидите в вашем браузере три фрейма:
Здесь присутствует каждый класс в SDK. Выберите класс Многие из терминов предыдущего параграфа (например, пакет ) являются для вас новыми. Не беспокойтесь. Мы рассмотрим каждый из них подробно. Пока важно знать, что документация по языку Java доступна в интерактивном режиме. Концепции ООПЧто такое объект?Java - это так называемый объектно-ориентированный (ОО) язык, при помощи которого вы можете заниматься объектно-ориентированным программированием (ООП). Такой стиль программирования очень отличается от процедурного программирования и может показаться немного странным для большинства программистов, не сталкивавшихся с ООП. Прежде всего, надо понять, что такое объект; именно на этом понятии базируется ООП. Объект - это самостоятельный фрагмент кода, который знает о себе и может рассказать об этом другим объектам, если они зададут вопрос, который он понимает. Объект имеет члены (переменные) и методы, являющиеся вопросами, на которые он может ответить (даже если они не выглядят вопросами). Набор методов, на которые объект знает как реагировать, является его интерфейсом. Некоторые методы являются общедоступными (public), это означает, что другой объект может вызвать (или активизировать) их. Этот набор методов известен под названием public-интерфейс . Когда один объект вызывает метод другого объекта, это называется передачей сообщения. Эта фраза соответствует ОО-терминологии, но чаще всего в Java-мире люди говорят "Вызвать этот метод", а не "Передать это сообщение". В следующем разделе мы рассмотрим концептуальный пример, который должен прояснить все это. Концептуальный пример объектаПредположим, что мы имеем объект Человек. Каждый объект Человек имеет имя, возраст, национальность и пол. Каждый объект Человек знает, как говорить и ходить. Один объект может спросить у другого о его возрасте, или может cказать, чтобы другой объект начал (или закончил) перемещение. В терминах программирования вы можете создать объект Person и назначить ему некоторые переменные (например, имя и возраст). Если вы создали второй объект Person, он может спросить у первого его возраст или сказать ему начать перемещение. Он может сделать это путем вызова методов первого объекта Person. Когда мы начнем писать код на языке Java, вы увидите, как язык реализует концепцию объекта. Обычно концепция объекта остается неизменной и в языке Java и в других объектно-ориентированных языках программирования, хотя реализуют они ее по-разному. Эта концепция универсальна. По этой причине объектно-ориентированные программисты, независимо от применяемого ими языка, общаются не так, как процедурные программисты. Процедурные программисты часто говорят о функциях и модулях. Объектно-ориентированные программисты говорят об объектах и часто говорят о них, используя личные местоимения. Вы часто можете услышать, как один ОО-программист говорит другому: "Этот объект Supervisor говорит здесь объекту Employee "Дай мне свой ID", поскольку он должен назначить задания для Employee". Процедурные программисты могут считать такой способ мышления странным, но он является естественным для ОО-программистов. В их программном мире все является объектом (с некоторыми исключениями в языке Java), а программы представляют собой взаимодействие (или разговор) объектов между собой. Фундаментальные принципы ООПЕстественно, концепция объекта является критичным понятием для ООП, как идея о том, что объекты общаются между собой при помощи сообщений. Но существуют также три других фундаментальных принципа, которые вы должны понимать. Вы можете запомнить три фундаментальных принципа ООП при помощи акронима PIE (ПНИ):
Это все необычные названия, но эти концепции не трудно понять. В следующих нескольких разделах мы подробно рассмотрим каждую из них в обратном порядке. ИнкапсуляцияВспомните, что объект является самодостаточной сущностью, содержащей элементы данных и действия, которые он может выполнить с этими элементами. Это реализация принципа, известного под названием сокрытие информации. Идея заключается в следующем. Объект знает о себе. Если другой объект хочет узнать информацию о другом объекте, он должен спросить о ней. В терминах ООП он должен послать сообщение объекту, например, для запроса информации о его возрасте. В терминах Java он должен вызвать метод объекта, который возвращает возраст. Инкапсуляция гарантирует индивидуальность каждого объекта, а программы представляют собой общение между объектами. Язык программирования Java позволяет программисту нарушить этот принцип, но это почти всегда является плохой идеей. НаследованиеПри вашем рождении, говоря с биологической точки зрения, вы являлись комбинацией ДНК ваших родителей. Вы не были точной копией ни одного из них, но были похожи на обоих. ОО использует для объектов этот же принцип. Представьте опять объект Человек. Вспомните, что каждый этот объект имеет национальность. Не все эти объекты имеют одинаковую национальность, но не являются ли они похожими? Конечно! Это не Лошади, или Шимпанзе, или Киты. Это объект Человек. Все объекты Человек имеют определенные общие признаки, отличающие их от животных других типов. Но они немного отличаются друг от друга. Похож ли Ребенок на Подростка? Нет. Они двигаются и говорят по-разному. Но Ребенок определенно является Человеком. В терминах ООП Человек и Ребенок являются классами в одной иерархии и (вероятнее всего) Ребенок наследует характеристики и поведение от своего родителя. Мы говорим, что конкретный Ребенок имеет тип Человек, или что этот Ребенок наследуется из объекта Человек. Это не срабатывает в обратную сторону - Человек не обязательно Ребенок. Каждый объект Ребенок является экземпляром класса Ребенок, и когда мы создаем объект Ребенок, мы создаем его экземпляр. Представляйте класс как шаблон для экземпляров этого класса. Обычно то, что может делать объект, зависит от типа объекта или, другими словами, от того, экземпляром какого класса он является. И Ребенок, и Подросток имеют тип Человек, но один может работать, а другой нет. В терминах Java Человек - это суперкласс классов Ребенок и Подросток, которые являются подклассами класса Человек. Еще одной концепцией, связанной с наследованием, является абстракция. Человек находится на более высоком уровне абстракции, чем Ребенок или Подросток. Оба они имеют тип Человек, но несколько отличаются. Все объекты Человек имеют некоторые общие свойства (например, имя и возраст). Вы можете создать экземпляр класса Человек? Нет. Вы имеете либо экземпляр класса Ребенок, либо класса Подросток. Человек, в терминах Java, является абстрактным классом. Вы не можете иметь прямой экземпляр класса Человек. Только Ребенок или Подросток, которые оба имеют тип Человек, являются реальными. Рассмотрение абстрактных классов выходит за рамки данного руководства, поэтому мы больше о них говорить не будем. Теперь, подумайте, что значит для объекта Ребенок действие "говорить". Мы рассмотрим смысл этого в следующем разделе. Полиморфизм"Говорит" ли Ребенок также как Подросток? Конечно же, нет. Ребенок издает шум, который не всегда является распознаваемыми словами, которые используют объекты Подросток. Поэтому, когда я создаю экземпляр объекта Ребенок (высказывание "создать экземпляр Ребенка" означает то же самое - слово "объект" подразумевается) и указываю ему "говорить", он может ворковать или булькать. Ожидается, что Подросток будет более внятен. В иерархии человечества мы имеем класс Человек на вершине иерархии и классы Ребенок и Подросток ниже, в качестве подклассов. Все объекты Человек могут говорить, поэтому объекты Ребенок и Подросток тоже могут, но делают это по-разному. Ребенок булькает и издает простейшие звуки. Подросток произносит слова. Вот что означает полиморфизм: объекты делают вещи по-разному. В чем состоит (и в чем нет) объектно-ориентированность языка JavaКак мы увидим, язык Java позволяет создавать первоклассные объекты, но не все в языке является объектом. Это немного не так, как в некоторых других объектных языках, например Smalltalk. Smalltalk является чистым объектно-ориентированным языком, т.е. все в нем является объектом. Язык Java является смесью объектов и других сущностей, не являющихся объектами. Он также позволяет одному объекту знать внутренности другого, если вы, как программист, реализуете такую возможность. Это нарушает принцип инкапсуляции. Однако язык программирования Java также предоставляет каждому программисту инструменты, необходимые для следования всем правилам ООП и создания очень хорошего объектно-ориентированного кода. Но это требует некоторой дисциплины. Язык не заставляет вас делать правильные вещи. Хотя многие ярые сторонники объектно-ориентированного подхода справедливо спорят о том, является ли язык Java объектно-ориентированным или нет, это на самом деле не так уж и важно. Платформа Java появилась, чтобы остаться. Научитесь применять ООП с Java там, где это возможно, и оставьте аргументы о чистоте другим. Язык Java позволит вам писать понятные, относительно лаконичные и управляемые программы, которые достаточно хороши для большинства профессиональных ситуаций. Язык Java изнутриКак работает платформа JavaВ языке Java, как и во многих других языках программирования, для создания программы вы пишете исходный код, затем компилируете его; компилятор проверяет соответствие вашего кода синтаксическим правилам языка. Java-платформа добавляет еще один шаг к этому процессу. После компиляции Java-кода получаются байт-коды. Виртуальная машина Java (JVM) затем интерпретирует эти байт-коды во время исполнения - то есть тогда, когда вы запускаете Java-программу. С точки зрения файловой системы при написании кода вы создаете файл с расширением .java. После компилирования этого файла компилятор Java создает файл с расширением .class, который содержит байт-коды. JVM читает и интерпретирует этот файл во время исполнения, и то, как она делает это, зависит от платформы, на которой вы работаете. Для работы на других платформах вы должны откомпилировать ваш исходный код с библиотеками, специфичными для этой платформы. Как вы понимаете, обещание "Write Once, Run Anywhere" (написать один раз, запускать везде) превращается в высказывание "Write Once, Test Anywhere" (написать один раз, проверить везде). Существуют тонкие (или не такие тонкие) отличия платформ, которые могут вызвать различное выполнение вашего кода на различных платформах. Сборка мусораПри создании Java-объектов JRE автоматически выделяет оперативную память для этого объекта из кучи, которая представляет собой большой пул памяти, доступный на вашей машине. Система времени исполнения отслеживает эти объекты за вас. Когда ваша программа больше не использует их, JRE избавляется от них. Вам не нужно об этом беспокоиться. Если вы писали какие-либо программы на языке программирования C++, который тоже является (вероятно) объектно-ориентированным, то знаете, что как программист вы должны распределять и освобождать память для ваших объектов явно при помощи функций Сборщик мусора в Java - это фоновый процесс, который занимается удалением неиспользуемых объектов вместо того, чтобы заставлять вас делать это явным образом. Компьютеры прекрасно подходят для слежения за тысячами вещей и для размещения ресурсов. Java-платформа позволяет компьютерам делать это. Она хранит счетчик ссылок для каждого объекта в памяти. Вы можете вручную вызвать сборщик мусора, но я никогда не делал этого на протяжении всей моей карьеры. Он обычно работает сам по себе и определенно будет работать для каждого примера из данного руководства. IDE против инструментов командной строкиКак мы уже отмечали ранее, Java-платформа поставляется с инструментами командной строки, которые позволяют компилировать Главной причиной использования IDE является управление файлами и путями в самой IDE и наличие мастеров, помогающих вам при необходимости изменить вашу среды времени исполнения. Если я хочу откомпилировать Java-программу при помощи инструмента командной строки Если вы хотите или вынуждены использовать инструменты командной строки, то можете найти дополнительную информацию по их использованию на Web-сайте Sun по Java-технологии. ООП с использованием Java-технологииВведениеJava-технология охватывает большую область, но язык сам по себе не является очень большим. Однако описать его - не простая задача. Данный раздел руководства не рассматривает язык полностью. Вместо этого будет рассмотрено все, что вам необходимо знать для начала работы с языком, и то, с чем вы наиболее вероятно столкнетесь как начинающий программист. В других учебниках рассмотрены различные аспекты языка Java, дополнительные полезные библиотеки фирмы Sun (и других источников) и даже разные IDE. Мы приведем здесь достаточно информации с пояснениями и примерами кода, для того чтобы вы смогли начать написание Java-программ и научиться правильно применять ООП в среде Java. Сейчас это зависит только от практики и обучения. Большинство руководств для начинающих читаются как справочные книги по спецификации языка. Сначала вы видите все синтаксические правила, затем некоторые примеры использования, затем более сложные темы, например, объекты. Мы не будем придерживаться этой схемы. Мы поступаем так потому, что главной причиной плохого объектно-ориентированного кода в программах на Java является отсутствие погруженности начинающих программистов в объекты с самого начала обучения. Объекты рассматриваются как дополнительная возможность, или вспомогательная тема. Вместо этого мы совместим изучение синтаксиса Java с изучением Java OO. Таким образом, в конце обучения вы будете иметь цельную картину использования языка в контексте объектно-ориентированного подхода. Структура Java-объектаВспомните, что объект представляет собой инкапсулированную сущность, которая знает о себе и может выполнять какие-либо действия при соответствующем запросе. Каждый язык имеет свои правила определения объекта. В Java объекты обычно выглядят так, как представлено в следующем листинге, хотя они могут и не иметь всех этих частей:
Здесь присутствуют несколько концепций, которые мы обсудим в следующих разделах. Пакеты (package)Объявление package идет первым при определении класса:
Каждый Java-объект существует в пакете. Если вы не укажете явно, к какому из них он принадлежит, Java поместит его в пакет по умолчанию. Пакет - это просто набор объектов, каждый из которых (обычно) как-то связан с другими объектами в пакете. Пакет ссылается на путь к файлу в вашей файловой системе. Названия пакетов используют схему с точками для преобразования этого пути к файлу в подходящий вид для Java-платформы. Каждая часть названия пакета называется узлом . Например, в пакете Выражения importВ определении класса далее следуют выражения
Когда ваш объект использует объекты из других пакетов, Java-компилятор должен знать, где их найти. Выражения
Каждое выражение
Если вы импортируете более одного класса из одного и того же пакета, то можете использовать сокращенную запись. Например, если бы я хотел использовать
Вы должны указывать выражение Объявление классаДалее идет определение класса :
Вы определяете Java-объект как класс. Представляйте класс как шаблон для объекта, примерно как форму для печенья. Класс определяет тип объекта, который вы можете создать с его помощью. Вы можете наштамповать любое количество объектов этого типа. Когда вы делаете это, то создаете экземпляр класса. Примечание: Слово объект обычно используется взаимозаменяемо как для ссылки на класс, так и для ссылки на экземпляр класса. Спецификатор доступа (accessSpecifier) для класса может иметь несколько значений, но чаще всего он устанавливается в значение public (открытый), и мы будем рассматривать в данном руководстве только его. Назвать класс вы можете как угодно, но по соглашению имена классов начинаются с большой буквы, и с большой буквы начинается также каждое последующее слово в имени. Классы имеют два типа членов: переменные (или данные-члены ) и методы. Все члены класса определены в теле класса, которое находится внутри одного набора фигурных скобок для класса. ПеременныеЗначения переменных класса являются тем, чем отличается каждый экземпляр класса. Вот почему их часто называют переменными экземпляра. Переменная имеет спецификатор доступа, тип данных, имя и (не обязательно) начальное значение. Вот список спецификаторов доступа и их значений:
Если вы попробуете обратиться к недоступной для вас переменной, компилятор предупредит вас о том, что переменная не видима для вас. Обстоятельства, в которых вы должны использовать тот или иной спецификатор доступа, мы рассмотрим позже. МетодыМетоды класса определяют, что он может делать. Есть два типа методов в языке Java:
Оба типа методов имеют спецификаторы доступа (которые определяют, какие другие объекты могут их использовать), тела (между фигурными скобками) и содержат один или несколько операторов. Кроме этого, их форма и функция различны. Мы рассмотрим каждый из них по очереди в следующих двух разделах. КонструкторыКонструкторы позволяют вам указать, как создавать экземпляр класса. Конструктор объявляется следующим образом:
Вы всегда имеете конструктор по умолчанию (не имеющий аргументов) для каждого класса, который создаете. Вы даже не должны определять его. Конструкторы отличаются от других методов тем, что не имеют типа возвращаемых данных, поскольку возвращаемый тип данных собственно и является классом. Конструктор вызывается следующим образом:
При вызове конструктора используется ключевое слово Другие методыОстальными методами в языке Java вы будете пользоваться чаще всего. Объявляются они следующим образом:
Каждый метод имеет тип возвращаемых данных, но не каждый метод возвращает что-либо. Если метод ничего не возвращает, в качестве возвращаемого типа используется ключевое слово
Методы вызываются следующим образом:
Здесь, мы вызываем Ваш первый Java-объектСоздание пакетаПерейдите в перспективу Java Browsing в Eclipse, если уже не находитесь в ней. Мы собираемся создать первый Java-класс. Первым шагом является создание места, где будет размещаться класс. Вместо использования пакета по умолчанию давайте создадим один конкретно для проекта Intro. Выберите File>New>Package. При этом должен отобразиться мастер Package (см. рисунок 3).
Рис. 3. Мастер Package Введите intro.core в качестве имени пакета и нажмите Finish. В рабочей области вы должны увидеть следующий пакет в виде Packages:
Обратите внимание на то, что пиктограмма слева от пакета прозрачна, то есть, выглядит затемненной версией пиктограммы пакета. Это общее соглашение в пользовательском интерфейсе Eclipse для обозначения пустых элементов. Ваш пакет пока не содержит каких-либо Java-классов, поэтому пиктограмма затемнена. Объявление классаВы можете создать Java-класс в Eclipse, выбрав File>New, но мы вместо этого будем использовать панель инструментов. Посмотрите на верхнюю часть вида Packages и найдите инструменты для создания проектов, пакетов и классов. Нажмите кнопку New Java Class (зеленая буква "C") для отображения мастера New Java Class. Введите Adult в качестве имени класса и примите все значения по умолчанию, нажав Finish. Теперь вы должны увидеть несколько изменений:
Сейчас класс выглядит следующим образом:
Eclipse генерирует оболочку или шаблон для класса за вас и вставляет оператор Однако прежде чем продолжить, давайте продемонстрируем способ работы в Eclipse IDE, который облегчает жизнь. В редакторе измените слово class на clas и подождите несколько секунд. Обратите внимание на то, что Eclipse подчеркнет его красной волнистой линией. Если вы поместите над ней указатель мыши, Eclipse отобразит информационное окно, предупреждающее вас о наличии синтаксической ошибки. Eclipse помогает вам, периодически компилируя ваш код и ненавязчиво предупреждая вас о наличии проблемы. Если бы вы использовали программу командной строки КомментарииКак большинство других языков программирования, Java поддерживает комментарии, являющиеся простыми строками, которые компилятор игнорирует при проверке синтаксиса. Java поддерживает несколько вариантов комментариев:
Последний вариант наиболее интересен. В двух словах, Зарезервированные словаСуществует еще одна тема, которую мы должны рассмотреть перед началом написания кода, который компилятор будет проверять. В языке Java существуют некоторые слова, которые вы не можете использовать при именовании ваших переменных. Вот их список:
Это не очень большой список, и Eclipse отображает зарезервированные слова жирным шрифтом при их вводе, поэтому вы даже не должны их запоминать. Все слова, кроме трех последних, являются ключевыми словами языка Java. Последние три слова - это зарезервированные слова. Для наших целей между ними нет разницы; вы не можете использовать ни те, ни другие. Теперь немного реального кода. Добавление переменныхКак я говорил ранее, экземпляр
Теперь каждый экземпляр
Примитивные типы данныхСуществует девять примитивных типов данных, с которыми вы, вероятнее всего, регулярно будете сталкиваться:
Мы использовали Мы определили каждую переменную в отдельной строке, но это не обязательно. Если у вас есть две или более переменных одного типа, вы можете определить их в одной строке, разделив запятыми, например:
Если бы мы захотели инициализировать эти переменные при их объявлении, то могли бы просто добавить инициализацию после каждого названия переменной:
Теперь наш класс знает о себе, и мы можем доказать это, что и сделаем в следующем разделе. Метод main()Существует специальный метод, который вы можете включить в любой класс, для того чтобы JRE мог выполнить код. Он называется
В теле метода После создания экземпляра Выполнение кода в EclipseДля выполнения этого кода вам осталось сделать в Eclipse совсем немного. Выберите класс
Рис. 5. Результаты выполнения программы Обратите внимание на то, что переменные содержали их значения по умолчанию. По умолчанию каждая переменная экземпляра пользовательского или встроенного типа имеет значение
Запустите код повторно, нажав на пиктограмму "бегущий человек". Вы должны увидеть на консоли новые значения. Теперь сделаем наш объект Добавление поведенияМетоды доступа (accessor)Просмотр содержимого нашего объекта Методы доступа аналогичны всем остальным методам, но они обычно придерживаются специальных соглашений по наименованию. Для предоставления значения переменной экземпляра другому объекту создайте метод с названием getVariableName(). Таким же образом для разрешения другим объектам установки значений переменных экземпляра создайте метод с названием setVariableName() . В Java-сообществе эти методы доступа обычно называются методами getter и setter, поскольку их названия начинаются с Вот некоторые общие характеристики методов getter и setter:
Объявление методов доступаМы можем добавить методы доступа для переменной экземпляра
Метод Мы также могли использовать оператор Вызов методовТеперь, когда у нас есть методы доступа, мы должны заменить прямой доступ к переменной
Если вы выполните этот код снова, результаты должны быть такими же, что и раньше. Обратите внимание на то, что вызвать метод объекта легко. Используйте следующую форму:
Если метод не принимает параметры (как наш метод getter), вы все равно должны добавить круглые скобки после имени вызываемого метода. Если метод принимает параметры (как наш метод setter), укажите их внутри круглых скобок, разделяя запятыми в том случае, если их больше одного. Пару слов о методе Перед продолжением работы давайте попробуем использовать метод
Теперь выполним код опять. Результат должен быть равен 35. Вот что происходило за кулисами:
Методы, не являющиеся методами доступаМетоды доступа полезны, но мы хотим, чтобы наши объекты
Пока синтаксис должен быть вам знаком. Метод возвращает строку символов. Давайте используем его и очистим метод
Повторите выполнение кода. Вы должны увидеть слово hello на консоли. СтрокиМы использовали несколько переменных с типом Вы уже видели, как создать экземпляр объекта
Поскольку строки в языке Java являются объектами, вы можете использовать оператор Вы можете сделать многое с переменными
Вместо использования
Этот код может выглядеть немного странным, поэтому давайте рассмотрим его вкратце, слева направо:
Итак, JRE берет имя нашего объекта В Eclipse вы можете увидеть все доступные методы любого объекта, поместив вашу точку вставки после точки, которая следует за переменной, содержащей экземпляр, и нажав затем Ctrl-Spacebar. При этом отобразится список методов объекта, находящегося слева от точки. Вы можете пролистать список (он свернут) при помощи стрелок управления курсором на вашей клавиатуре, выделить желаемый метод и нажать Enter для его выбора. Например, для просмотра всех методов, доступных для объектов Использование строкТеперь давайте используем соединение строк в нашем классе
Eclipse должен был показать красные волнистые линии в методе, поскольку эти переменные экземпляра еще не существуют. Это означает, что код не может быть откомпилирован. Теперь замените существующую переменную экземпляра
Затем замените первый вызов
Теперь у нас есть более симпатичный метод
Этот код делает то же самое, но демонстрирует явное использование метода Арифметические операторы и операторы присваиванияНаш объект Прежде всего, добавим переменную экземпляра для отслеживания количества шагов, сделанных объектом
Теперь добавим метод с названием
Наш метод принимает целочисленный параметр, указывающий количество шагов, которые нужно сделать, обновляет переменную progress, хранящую это количество шагов, и отображает на экране некоторые результаты. Также хорошо было бы добавить метод В нашем методе мы обновляем переменную
Применение оператора присваивания В приведенной ниже таблице представлен список и краткое описание большинства обычно встречающихся в Java арифметических операторов и операторов присваивания (обратите внимание на то, что некоторые операторы являются бинарными и используют два операнда, а некоторые являются унарными и используют один операнд).
Мы также уже встречали и другие обозначения, которые называются операторами в языке Java. Например: Условное выполнениеЗнакомство с условным выполнениемКод, который просто выполняется от первого выражения до последнего без изменения направления, в действительности может сделать не многое. Чтобы быть полезными, ваши программы должны принимать решения и, возможно, действовать по-разному в разных ситуациях. Как и любой другой полезный язык программирования, Java предоставляет средства для этого в виде различных операторов и выражений. В данном разделе рассматривается большое число таких операторов и выражений, доступных вам при работе с Java-кодом. Операторы отношения и условные операторыЯзык программирования Java предоставляет некоторые операторы и некоторые выражения по управлению потоком выполнения для того, чтобы вы могли принимать решения в вашем коде. Наиболее часто решение в коде начинается с булевого выражения (которое имеет значение истинно (true) или ложно (false)). Эти выражения используют операторы отношения, которые сравнивают один операнд или выражение с другим, и условные операторы. Вот их список:
Условное выполнение с ifТеперь мы должны использовать эти операторы. Давайте добавим простую логику к нашему методу
Теперь логика в методе проверяет, насколько большим является значение
Фигурные скобки необязательны, если после Область видимости переменныхКаждая переменная в Java имеет область видимости, или характеристики, определяющие, где вы можете обратиться к этой переменной только по ее имени. Если переменная находится в области видимости, вы можете взаимодействовать с ней по ее имени. В противном случае - нет. В языке Java существует несколько уровней области видимости, определяемые местом объявления переменной. Примечание: Насколько мне известно, ни один из них не является официальным, но это обычные названия, используемые программистами.
Область видимости переменной простирается до конца секции (или блока) кода, в котором она была объявлена. Например, в нашем методе Другие формы ifМы можем сделать условную проверку более привлекательной, используя другую форму выражения
Наш метод мог бы выглядеть следующим образом:
Существует также краткая версия выражения
Но это не выполнило бы нашу задачу, поскольку, если значение Выражение switchВыражение
JRE вычисляет целочисленное выражение, выбирает подходящий вариант (case) и выполняет выражения этого варианта. Последним выражением каждого варианта, за исключением последнего, является По существу, выражение Пример выражения switchНиже приведен тривиальный пример использования выражения
Наконец, вот пример того, как использование перехода на следующий вариант может быть красивым приемом:
Здесь мы видим, что варианты 2, 3 и 9 обрабатываются одним способом, а оставшиеся варианты - другим. Обратите внимание на то, что варианты не обязательно должны идти по порядку, и что переход в следующий вариант мы в данном случае использовали с пользой. Повторение работыВ начале данного руководства мы все делали без использования условий, что в определенной мере хорошо, но имеет свои ограничения. Аналогично, иногда нужно выполнить какое-либо действие повторно, до тех пор, пока не будет выполнена какая-нибудь работа. Например, предположим, что мы хотим сказать больше, чем просто "hello" в нашем объекте
Они известны под общим названием - циклы (например, "цикл Циклы forСамой главной циклической конструкцией в языке Java является выражение
В выражении инициализации устанавливается начало цикла. В выражении завершения устанавливается условие завершения цикла. В выражении приращения определяется величина, на которую увеличивается переменная инициализации после каждого цикла. В каждом цикле выполняются выражения в блоке, который является набором выражений между фигурными скобками (помните, что любой блок кода в Java располагается между фигурными скобками, а не только блок в цикле Использование циклов forИзменим наш метод
Класс Теперь замените наш старый метод
После его выполнения вы должны получить на консоли выражение Циклы whileСначала мы попробуем цикл
Общий синтаксис цикла
Цикл Здесь мы видим, что цикл Мы рассмотрели циклы Циклы doСледующий код делает ту же самую работу, что и два рассмотренных нами ранее цикла:
Общий синтаксис циклов
Цикл Перед завершением работы с циклами рассмотрим два выражения ветвления, которые могут быть полезны. Мы уже встречались с выражением
Если вы поместите этот код в ваш метод
В первых двух прохождениях цикла переменная Рассмотрев в следующем разделе обработку коллекций, мы усложним поведение. КоллекцииЗнакомство с коллекциямиБольшая часть реальных приложений имеет дело с коллекциями чего-либо (файлов, переменных, строк файлов и т.д.). Часто объектно-ориентированные программы работают с коллекциями объектов. Язык Java имеет усовершенствованную библиотеку Collections Framework, которая позволяет вам создавать и управлять коллекциями объектов различных типов. Эта библиотека сама может занять целое руководство, поэтому здесь мы не будем рассматривать ее всю. Вместо этого мы рассмотрим одну очень широко используемую коллекцию и некоторые способы ее применения. Эти способы подходят для большинства коллекций, доступных в языке Java. МассивыБольшинство языков программирования поддерживают концепцию массива для хранения коллекции сущностей, и язык Java не является исключением. Массив представляет собой коллекцию элементов одного типа. Существует два способа объявления массива:
В общем случае массив объявляется следующим образом:
Создать целочисленный массив из пяти элементов можно двумя способами:
Первое выражение создает пустой массив из пяти элементов. Второе выражение создает инициализированный массив. Между фигурными скобками можно указать список начальных значений, разделенных запятыми. Обратите внимание на то, что мы не указали размер массива в квадратных скобках - количество элементов нашего блока инициализации устанавливает размер массива в пять элементов. Это проще, чем создать массив, а затем закодировать цикл для присвоения значений его элементам, например, так:
Этот код также объявляет целочисленный массив из пяти элементов. Если вы попытаетесь поместить более пяти элементов в массив, у вас возникнут проблемы при выполнении кода. Для загрузки массива мы выполняем цикл от 1 до длины массива, которую мы определяем при помощи метода После загрузки нашего массива мы можем обращаться к его элементам в аналогичном цикле:
Представляйте массив как последовательность ячеек памяти. Каждый элемент в массиве занимает одну ячейку памяти, которой назначен индекс при создании массива. Вы можете обратиться к элементу в конкретной ячейке так:
Индексы массива отсчитываются с нуля; это означает, что первый элемент имеет индекс 0. Теперь наш цикл имеет смысл. Мы начинаем цикл с нуля, поскольку массив начинается с нуля, и проходим по каждому элементу массива, отображая его значение. Что такое коллекция?Массивы хороши, но работать с ними немного не удобно. Их загрузка требует усилий, а после объявления массива вы можете загрузить в него только значения определенного типа и только определенное количество элементов, которое может поместиться в массиве. Определенно, массивы не являются слишком объектно-ориентированными. Фактически, присутствие массивов в языке Java является пережитком времен до объектно-ориентированного программирования. Они применяются в программном обеспечении повсеместно, поэтому их отсутствие в языке могло бы затруднить его существование в реальном мире, особенно при необходимости взаимодействия со старыми системами, использующими массивы. Однако язык Java предоставляет вам намного больше инструментов для обработки коллекций элементов. Эти инструменты являются абсолютно объектно-ориентированными. Концепцию коллекций понять не трудно. Когда вам нужно фиксированное число элементов одного и того же типа, вы можете использовать массив. Когда вам нужны элементы различных типов или необходимо динамически менять их количество, вы можете использовать Java Collection. ArrayListВ данном руководстве мы рассмотрим только один тип коллекций, называемый Для использования
Пустой
Добавить и удалить элементы из списков очень просто. Есть несколько методов для этого, но наиболее широко используются следующие два из них:
Упаковка и распаковка примитивовКоллекции Java хранят объекты, а не примитивы. Массивы могут хранить и то, и другое, но они чаще всего не объектно-ориентированы, как мы того хотим. Если вы хотите записать в список что-либо, являющееся подтипом
Он добавляет объект в конец списка. Чем дальше, тем лучше. Но что случится, если вы захотите добавить примитивный тип в список? Вы не можете сделать это напрямую. Вместо этого вы должны заключить примитивы в объекты. Существует один класс-конверт (wrapper class) для каждого примитивного типа:
Например, для помещения примитивного типа
Заключение примитива в экземпляр класса-конверта называется также упаковкой примитива. Для извлечения примитива вы должны распаковать его. Существует много полезных методов в классах-конвертах, но сам факт необходимости их использования раздражает многих программистов, поскольку требует большой дополнительной работы для использования примитивов с коллекциями. Java 5.0 уменьшает эту работу путем поддержки автоматической упаковки/распаковки . Использование коллекцийБольшинство подростков в реальном мире носят с собой некоторое количество денег. Предположим, что каждый объект
Помните наш массив целых чисел? Давайте вместо него использовать
Мы создали
Предоставляемые вами методы доступа являются законным вызовом. В данном случае мы применили типичные. Нет причин, почему бы мы не могли вызвать Теперь добавим несколько методов, позволяющих нам взаимодействовать с нашей переменной
В следующих двух разделах мы более подробно рассмотрим их. Взаимодействие с коллекциямиМетод Метод Давайте применим эти методы в
В методе
Это стандартная процедура для прохождения по коллекции в языке Java. В качестве альтернативы, мы могли бы вызвать Единственной новой концепцией здесь является приведение типов. Что это такое? Как мы уже знаем, объекты в языке Java имеют тип или класс. Если вы посмотрите на сигнатуру метода Усовершенствование вашего объектаВведениеСейчас наш объект
По ходу дела мы изучим некоторые приемы рефакторинга и узнаем, как решать некоторые проблемы, возникающие при выполнении нашего кода. Создание конструкторовМы говорили о конструкторах ранее. Вы, возможно, помните, что каждый объект вашего Java-кода автоматически получает конструктор по умолчанию, не принимающий аргументов. Вы не должны определять его и можете не увидеть его в коде. Фактически, мы воспользовались этим в нашем классе Однако на практике желательно определять свои собственные конструкторы. Поступая таким образом, вы можете быть абсолютно уверенны в том, что кто-либо, исследующий ваш класс, будет знать, как его создавать именно тем способом, который вы для этого предусматривали. Потому давайте создадим наш собственный конструктор без аргументов. Вспомните общую структуру конструктора:
Определить конструктор без аргументов для
Все. Наш конструктор без аргументов действительно не делает ничего, кроме создания
Этот конструктор принимает два аргумента и устанавливает в их значения две наши переменные экземпляра. Теперь у нас есть два конструктора. Нам, фактически, не нужен первый конструктор, но нет ничего страшного, если мы сохраним его. Он предоставляет пользователям данного класса варианты выбора. Они могут создавать То, что мы сейчас сделали, даже если вы, возможно, не знали этого, называется перегрузкой метода. Мы обсудим эту концепцию более подробно в следующем разделе. Перегрузка методовПри создании двух методов с одинаковым названием, но с разным количеством (или с разным типом) параметров, вы перегружаете этот метод. Это одна из мощных возможностей объектов. Система времени исполнения Java определит вызываемую версию метода в зависимости от того, что вы передали в качестве аргументов. В ситуации с нашими конструкторами, если мы не передадим какие-либо аргументы, JRE будет использовать конструктор без аргументов. Если мы передадим два объекта Вы можете перегрузить любой метод, не только конструкторы, что облегчает создание удобного интерфейса для пользователей ваших классов. Давайте попробуем добавить еще одну версию нашего метода
Вот его перегруженная версия:
Этот метод очень похож на другой наш метод
После запуска кода на выполнение мы можем увидеть, что в кошельке нашего объекта Рефакторинг во время усовершенствованияРефакторинг представляет собой процесс изменения структуры существующего кода без изменения его функциональности. Ваше приложение должно выдавать такие же результаты и после рефакторинга, но код должен стать яснее, понятнее, с меньшим количеством дублирований. Удобно выполнять рефакторинг до добавления функциональной возможности (чтобы облегчить добавление, либо сделать более очевидным место, куда нужно добавить код), и после добавления функциональной возможности (для приведения в порядок добавленных изменений). В данном случае мы добавили новый метод и заметили дублирование кода. Время для рефакторинга! Прежде всего, мы должны создать метод, содержащий две строки дублированного кода. Назовем его
Мы сделали этот метод защищенным, поскольку это действительно наш собственный внутренний вспомогательный метод, а не часть открытого интерфейса нашего класса. Теперь заменим эти строки кода в наших методах вызовом нового метода:
Вот перегруженная версия:
Если вы опять выполните код, вы увидите те же самые результаты. Такой тип рефакторинга должен стать привычным. Eclipse облегчает работу при помощи нескольких встроенных видов автоматического рефакторинга. Их подробное обсуждение выходит за рамки данного руководства, но вы можете поэкспериментировать с ними. Если бы мы выделили эти две строки дублированного кода, допустим в первой версии Члены классаМетоды и переменные, которые мы имеем в классе Классы сами по себе тоже могут иметь переменные и методы. Они в совокупности называются членами класса, и вы можете объявить их при помощи ключевого слова
Когда имеет смысл добавить переменные класса или методы класса? Лучшее практическое правило - делать это редко, для того чтобы не злоупотреблять ими. Некоторыми обычными примерами их использования являются:
Переменные классаДля создания переменной класса используйте ключевое слово
JRE создает копию переменных экземпляра класса для каждого экземпляра этого класса. JRE создает только одну копию каждой переменной класса независимо от количества экземпляров сразу при первой встрече с этим классом в программе. Все экземпляры будут совместно использовать (и, возможно, изменять) эту копию. Это делает переменные класса хорошим выбором для констант, которые могут использовать все экземпляры. Например, мы использовали целые числа для описания "банкнот" в кошельке
По соглашению константы класса называются большими символами, отдельные слова констант разделяются знаками подчеркивания. Мы использовали ключевое слово
При чтении кода очевидно, что мы добавляем деньги в кошелек. Методы классаКак мы уже видели, вызов метода экземпляра осуществляется следующим образом:
Мы вызвали метод именованной переменной, хранящей экземпляр класса. Вызов метода класса осуществляется следующим образом:
Нам не нужен экземпляр для вызова этого метода. Для этого применяется сам класс. Используемый нами метод Мы можем создать методы класса для
Закомментируйте имеющиеся строки кода в методе
После выполнения этого кода вы должны увидеть соответствующее сообщение, дважды отображенное на консоли. Первый вызов Сравнение объектов с использованием ==Существует два способа сравнить объекты в языке Java:
Первый, наиболее употребляемый, сравнивает объекты на равенство. Другими словами, выражение:
возвратит
Первое сравнение возвращает Сравнение объектов с использованием equals()Сравнить объекты можно следующим образом:
Метод
Посмотрите на метод Это хорошо для примитивов, но что если мы хотим сравнить содержимое объектов? Оператор Попробуйте ввести следующий код в метод
Первое сравнение возвращает значение Перегрузка equals()Перегрузка метода
Мы перегрузим метод
Обратите внимание на то, что мы можем сравнить возраст каждого объекта с помощью Когда бы вы ни перегрузили
Как правило, возврат значений хэш-кода для некоторых или всех переменных экземпляра объекта является достаточно хорошим способом вычисления хэш-кода. Другим вариантом является преобразование переменных в объекты Перегрузка toString()Класс
Результат, отображаемый в консоли, выглядит следующим образом:
Метод
Мы создаем
Это значительно удобнее и полезнее, чем загадочный ID объекта. Исключительные ситуацииХорошо было бы, если бы в нашем коде никогда не было ошибок, но это маловероятно. Иногда все происходит не так, как мы предполагали, а иногда проблема хуже, чем просто выдача нежелательных результатов. Когда это происходит, JRE генерирует исключительную ситуацию. Язык имеет некоторые специальные выражения, позволяющие вам перехватить исключительную ситуацию и обработать ее соответствующим образом. Вот общий формат для этих выражений:
Выражение Обработка исключительных ситуацийПопробуйте провести следующий эксперимент в
При выполнении этого кода мы получим исключительную ситуацию. На консоли отобразится следующая информация:
Эта трассировка стека отображает тип исключительной ситуации и номер строки, в которой она возникла. Помните, что мы должны выполнить приведение типа при удалении
Здесь мы перехватываем исключительную ситуацию и выводим красивое сообщение. В качестве альтернативы мы могли бы ничего не делать в блоке Иерархия исключительных ситуацийЯзык Java поддерживает полную иерархию исключительных ситуаций. Это значит, что существует много типов исключительных ситуаций. На самом высоком уровне некоторые исключительные ситуации проверяются компилятором, а некоторые, называемые
В вашем коде при вызове метода, указывающего, что он генерирует один или несколько типов исключительных ситуаций, вы должны как-то их обрабатывать, либо добавить ключевое слово Хорошей новостью является то, что большинство IDE (среди них, естественно, и Eclipse) предупредит вас о том, что нужно обработать исключительную ситуацию, генерируемую вызываемым методом. Вы можете решить, что делать. Тема обработки исключительных ситуаций, естественно, намного шире, но это слишком много для данного руководства. Надеюсь, что рассмотренные нами вопросы помогут вам знать, чего ожидать. Java-приложенияЧто такое приложенияМы уже видели приложение, хотя и очень простое. Наш класс
Для демонстрации того, как это работает, мы должны добавить еще один класс в наше приложение. Этот класс будет "управляющим". Создание управляющего классаНаш управляющий класс может быть очень простым:
Выполните следующие действия для создания класса таким образом, чтобы он действительно "управлял" нашей программой:
Все, что осталось сделать, - поместить что-нибудь в наш новый метод
Создайте новую конфигурацию запуска в Eclipse так же, как мы делали это для класса Сейчас мы имеем простое приложение, начинающееся в JAR-файлыКак пакетируется Java-приложение, для того чтобы другие могли использовать его, или как передается код, который они могут использовать в своих собственных программах (например, библиотеки полезных объектов или интегрированную среду)? Создается Java Archive (JAR) - файл, в который спакетирован ваш код, для того чтобы другие программисты могли включить его в свой Java Build Path в Eclipse или в свой classpath при использовании инструментальных программ командной строки. Опять Eclipse значительно облегчает вашу работу. Создание JAR-файла в Eclipse (и во многих других IDE) является простой процедурой:
Вы должны увидеть ваш JAR-файл в указанном вами месте. Если имеется JAR-файл (ваш или из другого источника), вы можете использовать классы, находящиеся в нем, в вашем коде, если поместите его в ваш Java Build Path в Eclipse. Сделать это не трудно. У нас пока нет кода, который нужно добавить к нашему пути, но выполните следующие действия, которые нужно было бы для этого сделать:
Если код (то есть файлы классов) в JAR-файлах находится в вашем Java Build Path, вы можете использовать эти классы в вашем Java-коде без получения ошибки компилятора. Если JAR-файл включает исходный код, вы можете связать эти исходные файлы с файлами классов в вашем пути. Тогда вы можете пользоваться всплывающей подсказкой и даже открыть и просмотреть код. Написание хорошего Java-кодаВведение в Java-кодВы уже знаете достаточно много о синтаксисе Java, но это не совсем то, в чем заключается профессиональное программирование. Что делает Java-программы "хорошими"? Вероятно, существует столько ответов на этот вопрос, сколько имеется профессиональных Java-программистов. Но у меня есть несколько предложений, с которыми, я уверен, согласились бы большинство профессиональных Java-программистов, и которые улучшают качество Java-кода. По правде говоря, я являюсь сторонником agile-методов (динамичных методов), таких как Экстремальное Программирование (Extreme Programming - XP), поэтому многое в моих представлениях о "хорошем" коде сформировано agile-сообществом и, в частности, принципами XP. Тем не менее, я считаю, что большинство опытных профессиональных Java-программистов согласилось бы с советами, которые я дам в данном разделе. Делайте классы маленькимиВ данном руководстве мы создали простой класс Обычно класс с очень большим числом методов содержит нечто, ему не свойственное, поскольку такой гигантский объект делает слишком много. В своей книге "Рефакторинг" Мартин Фаулер (Martin Fowler) называет это "загрязнением кода чуждыми методами" (Foreign Method code smell). Если у вас есть объект со 100 методами, вы должны хорошо подумать, не является ли этот один объект в действительности комбинацией нескольких объектов. Большие классы обычно отстают в школе. То же самое касается и Java-кода. Делайте методы маленькимиМаленькие методы также предпочтительны, как и маленькие классы, и по тем же причинам. Одним из огорчений, которые есть у опытных ОО-программистов в отношении языка Java, является то, что он дает широким массам пользователей объектно-ориентированный подход, но не учит их, как им правильно пользоваться. Другими словами, он дает достаточно веревки, чтобы повеситься (хотя и меньше, чем дает C++). Обычно это можно увидеть в классе с методом Представьте себе на минутку такие очень длинные методы. Перелистывание на экране десятков страниц кода для того, чтобы понять, что происходит, затрудняет понимание! Что делает метод? Вы должны выпить большую чашку кофе и изучать код несколько часов, для того чтобы понять это. Маленький, даже крошечный, метод является легко перевариваемым фрагментом кода. Эффективность во время исполнения не является причиной создания маленьких методов. Настоящим призом является читаемость. Это делает ваш код легким в обслуживании и в модификации при добавлении новых функциональных возможностей. Ограничивайте каждый метод до производительности одного действия. Называйте методы правильноЛучшая из когда-либо встреченных мной схем кодирования (и я забыл источник) называется: обнаруживающие намерения имена методов. Какой из двух следующих методов легче понять с первого взгляда?
Ответ должен быть очевидным. По некоторым причинам программисты испытывают антипатию к длинным именам. Конечно, абсурдно длинное имя может быть неудобным, но достаточная для понимания длина имени обычно не является абсурдно большой. У меня нет проблем с таким именем метода, как Потратьте несколько минут на очень описательное имя метода (если это возможно), придумайте имена методов таким образом, чтобы ваш код читался больше как английский текст, даже если это означает добавление дополнительных вспомогательных методов для выполнения работы. Например, обдумаем добавление вспомогательного метода, для того чтобы сделать следующий код более читаемым:
Метод
Теперь наше выражение
Этот технический прием прост и, возможно, в данном случае тривиален, но он поразительно эффективен, когда код усложняется. Минимизируйте количество классовОдним из правил простого дизайна в XP является достижение цели с минимально необходимым количеством классов. Если вам нужен еще один класс, конечно же, добавьте его. Если еще один класс упростил бы код или облегчил бы выражение ваших намерений, добавьте класс. Но нет причин иметь классы только для того, чтобы иметь их. Чаще всего в ранних версиях проекта имеется меньшее количество классов, чем в окончательной версии, но обычно легче выполнить рефакторинг для разбиения вашего кода на большее количество классов, чем для их объединения. Если у вас есть класс с большим количеством методов, проанализируйте его и определите, не содержится ли в нем другой объект, прежде чем это проявится явно. Если да, создайте новый объект. Почти во всех моих Java-проектах никто не боялся создавать классы, но мы также постоянно пытались уменьшить количество классов, не делая наши намерения менее ясными. Минимизируйте количество комментариевЯ когда-то писал обширные комментарии в моих программах. Вы могли читать их как книгу. Потом я стал немного умнее. Каждая программа обучения науке программирования, каждая книга по программированию и множество программистов, я уверен, советуют вам комментировать свой код. В некоторых случаях комментарии полезны. Во многих случаях они делают код более трудным для поддержки. Подумайте о том, что вы должны сделать при изменении кода. Есть в этом месте комментарий? Если есть, вам лучше бы менять комментарий, иначе он будет устаревшим и со временем может вовсе не описывать код. Исходя из моего опыта, это удваивает ваше время на обслуживание программы. Мое практическое правило: если код настолько тяжело прочитать и понять, что нужен комментарий, я должен сделать его достаточно понятным, для того чтобы комментарий был не нужен. Код может быть слишком длинным, или делать слишком много. Если это так, я упрощаю его. Он может быть слишком запутанным. Если это так, я добавляю вспомогательные методы, для того чтобы сделать его более понятным. Фактически, за три года совместного программирования на Java с участниками одной и той же команды я могу пересчитать количество написанных мной комментариев на пальцах моих рук и ног. Пишите понятный код! Если вам необходимо общее описание того, что делает система или какой-то конкретный ее компонент, напишите краткий документ для этого. Многословные комментарии обычно тяжелее в обслуживании, не выражают ваших намерений так, как это делает маленький, хорошо написанный метод, и быстро становятся устаревшими. Не попадайте в зависимость от комментариев. Используйте унифицированный стильСтиль кодирования на самом деле зависит от того, что необходимо и приемлемо в вашей среде. Я даже не знаю стиля, который мог бы назвать "типичным". Он часто зависит от личного вкуса. Например, вот некоторый фрагмент кода, который вызывает у меня судороги, пока я его не поменяю:
Почему он раздражает меня? Потому что я лично против стиля кодирования, при котором добавляются строки кода, по моему мнению, не нужные. Java-компилятор интерпретирует следующий код аналогично предыдущему, а я сохранил несколько строк:
Нет способа "правильного" или "неправильного". Один просто короче другого. Что же происходит, когда мне приходится кодировать вместе с тем, кто предпочитает первую форму? Мы говорим об этом, выбираем стиль кодирования, который собираемся придерживаться, затем фиксируем его. Единственным правилом на все случаи жизни является унификация. Если кто-то из работающих над проектом использует другой стиль, чтение кода станет трудным. Выберите стиль и не меняйте его. Избегайте использования операторов switchНекоторые Java-программисты любят выражения Теперь, можете ли вы выполнить рефакторинг кода таким образом, чтобы имелось только одно выражение Будьте открытыЯ оставил самые сомнительные рекомендации напоследок. Вдохните глубже. Я верю, что не будет ошибкой сделать все ваши методы открытыми ( Естественно, многие профессиональные программисты содрогнуться от этой мысли, поскольку если все будет открытым, любой может изменить что-либо, возможно, несанкционированно. В мире, где все является открытым, вы должны зависеть от дисциплинированности программиста для гарантии того, чтобы люди не получили доступ к тому, к чему не должны иметь доступ, и тогда, когда не должны иметь доступ. Но в жизни программиста мало найдется ситуаций более разочаровывающих, чем желание обратиться к переменной или методу, который ему не видим. Когда вы ограничиваете доступ к чему-нибудь в вашем коде, предполагая, что другие не должны его иметь, вы полагаете себя всеведущим. Чаще всего это опасное предположение. Такого рода разочарование часто наступает при использовании чужого кода. Вы можете увидеть метод, делающий точно то, что вам нужно, но он не доступен. Иногда есть веские причины этого, поэтому имеет смысл ограничить доступность. Однако иногда единственной причиной того, что метод не указан как Указывайте методы как По следам Фаулера (Fowler)Теперь вы знаете, как создавать хороший Java-код и как поддерживать его хорошим. Лучшей книгой по этой теме является "Рефакторинг" Мартина Фаулера (Martin Fowler). Ее даже читать легко. Рефакторинг означает изменение дизайна существующего кода без изменения его результатов. Фаулер говорит о "загрязнениях кода" ("code smells"), которые требуют рефакторинга, и очень подробно рассматривает различные технические приемы для их исправления. По моему мнению рефакторинг и способность писать код в стиле test-first (сначала тестирование) является самым важным умением, которое должны освоить начинающие программисты. Если бы каждый программист был хорош в обоих этих навыках, то это революционизировало бы отрасль. Если вы отлично освоите их, будет легче получить работу, поскольку вы будете способны достичь лучших результатов, чем большинство из ваших соратников. Писать Java-код относительно не сложно. Писать хороший Java-код - это мастерство. Стремитесь стать мастером. РезюмеИтогиВ данном руководстве вы познакомились с ООП, изучили синтаксис языка Java, позволяющий создавать полезные объекты, и попробовали поработать с IDE, помогающей управлять вашей средой разработки. Вы научились создавать объекты, которые могут делать много полезной работы, хотя определенно не все, что вы можете себе представить. Но вы можете продолжить свое обучение несколькими способами, включая внимательное изучение Java API и исследование других возможностей языка Java при помощи других руководств developerWorks. Ссылки на них приведены в разделе "Ресурсы". Язык Java, конечно же, не совершенен; каждый язык имеет свои капризы, и каждый программист имеет предпочтения. Однако Java-платформа является хорошим средством, помогающим писать очень хорошие профессиональные программы, которые очень востребованы. Об авторе Рой В. Миллер (Roy W. Miller) является независимым консультантом по разработке программного обеспечения, программистом и автором. Он начинал свою карьеру в Andersen Consulting (ныне Accenture), а не так давно в течение трех лет профессионально занимался использованием платформы Java в RoleModel Software, Inc., Holly Springs, NC. Он разрабатывал программное обеспечение, руководил группами и консультировал других программистов и клиентов, начиная с двух участников и заканчивая компаниями, входящими в Fortune 50. Рой также активный участник developerWorks.
|