Начинаем с начала или 'Hello, Java World!'

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

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

  • Инструктора, учебники, пособия и т.п. – это всё от лукавого. Лыжи можно освоить самостоятельно. К тому же, в школе он сносно научился ходить на беговых лыжах. Соответственно, все советы более знающих людей игнорируются.
  • Снаряжение выбирается самое крутое. Не ниже уровня эксперта. Жесткие ботинки, от которых болят ноги. Жесткие лыжи, чтобы прогнуть которые нужно приложить фантастические усилия, далеко превосходящие уровень физической подготовки Некто. Ну и т. д.
  • В качестве пробной трассы выбирается… ну, скажем, трасса, принимающая этап кубка мира по гигантскому слалому. Для учебы это как раз.
  • Далее в том же духе.

Итак, вопрос. Как вы назовете этого Некто?

Концепции объектно-ориентированного программирования JAVA

Перевод статьи JAVA Object Oriented Concepts

JAVA основывается на концепциях объектно-ориентированного программирования, что позволяет перейти на более высокий уровень абстракции, чтобы разрешить любую проблему реалистичным путем.
Объектно-ориентированный подход концептуализирует решение проблемы в плоскости объектов реального мира, которые легче повторно использовать в приложении. Например, Chair (стул), Fan (вентилятор), Dog (Собака), Computer (компьютер) и так далее.
В JAVA класс представляет собой макет, шаблон или прототип, который определяет общее поведение объекта данного типа. Экземпляр — это отдельная реализация класса, и все экзепляры класса имеют одинаковые свойства, которые описаны в определении класса. Например, вы можете опрделить класс с именем House (дом) с количеством комнат в качестве атрибута и создать экземпляры класса, такие как дом с двумя комнатами, дом с тремя комнатами и так далее.
Преимущества:
Ниже перечислены некоторые плюсы объектно-ориентированной разработки программного обеспечения (ПО).
  • Снижение затрат на поддержку ПО, в основном за счет того, что она осуществляется модульно.
  • Усовершенствованное повторное использование кода благодаря таким качествам, как наследование, и, как результат, более быстрая разработка ПО.
  • Повышенные надежность и гибкость кода.
  • Легкость понимания вследствие моделирования реального мира.
  • Лучшая абстракция на уровне объекта.
  • Уменьшение сложности перехода от одной фазы разработки к другой.

Есть четыре основные характеристики ООП:
  • Инкапсуляция
  • Наследование
  • Полиморфизм
  • Абстракция

Десять принципов объектно-ориентированного дизайна, которые должен знать Java-программист

Десять принципов объектно-ориентированного дизайна, которые должен знать Java-программист


Принципы объектно-ориентированного дизайна (далее — ООД) — ядро объектно-ориентированного программирования (далее — ООП), но я вижу большинство Java-программистов, работающих с паттернами Singleton («Одиночка», например Singleton), «Декоратор» (Decorator) или «Наблюдатель» (Observer), и не уделяющих должного внимания изучению объектно-ориентированного анализа и дизайна. Конечно, важно изучать основы ООП: абстракция, инкапсуляция, полиморфизм и наследование, но, в то же время, не менее важно знать принципы дизайна, чтобы создавать хорошо структурированные и понятные продукты. Постоянно наблюдаю программистов, разработчиков различного уровня, которые или не слышали о принципах ООД SOLID, или просто не знают о преимуществах, которые тот или иной принцип дизайна дает, или как применить его в коде.

В итоге, всегда стремитесь к связности кода и хорошему дизайну в решении. Отличные примеры для изучения Java и ООД — открытый код Apache и Sun. Они демонстрируют, как принципы ООД должны использоваться в написании кода, в программах на Java. Иллюстрация применения паттернов в JDK: Factory, паттерн «фабрика» в классе BorderFactory, Что такое паттерн дизайна Factory..., паттерн Singleton, «одиночка», в классе Runtime RunTime, паттерн Decorator, «декоратор», в различных java.io классах. К слову, если вы заинтересованы практиковаться в java-коде, прочтите Effective Java, Joshua Bloch (например, Effective Java в переводе на русский), шедевр от автора Java API. Еще на тему ООД и паттернов рекомендую Head First Design Pattern (на русском Дизайны проектирования), а также Head First Object Oriented Analysis and Design (на английском OOAD). Эти книги помогут писать лучший код, используя преимущества принципов ООД.

Хотя лучший способ усвоить любые принципы — практиковаться и понимать последствия нарушения этих самых принципов, тема этой статьи — введение в принципы ООД для java-программистов, которые пока их не используют или только изучают язык. Я полагаю, каждый из озвученных принципов ООД (SOLID) достоин отдельной статьи с подробным объяснением сути, и я в дальнейшем постараюсь (написать эти статьи — прим. перев.), но сейчас приготовьтесь просто быстро пробежаться.
  • ,

Полиморфизм на собеседовании

Здравствуйте, уважаемые джаварашовцы. Наверняка каждому, кто был на собеседовании задавали вопрос про полиморфизм. Так вот, интересует ваш ответ и оценка вашего ответа от интервьюера. У меня было 2 мини-собеседования, на которых спрашивали про полиморфизм и на каждом из них интервьер был не в восторге от моего ответа. Если вкратце, то мой ответ сводился к оверрайдингу и присвоению ссылке родительского класса объект дочернего класса. Как-то так:

class Parent{
    void saySomething(){
        System.out.println("Parent!");
    }
}
class Child1 extends Parent{
    @Override
    void saySomething(){
        System.out.println("Child1!");
    }
}

class Child2 extends Parent{
    @Override
    void saySomething(){
        System.out.println("Child2!");
    }
}

class Test{
    public static void main(String[] args){
        Parent p1 = new Parent();
        Parent p2 = new Child1();
        Parent p3 = new Child2();
        p1.saySomething();
        p2.saySomething();
        p3.saySomething();
    }
}

---------------
Output:
Parent!
Child1!
Child2!


На сайте Oracle все примерно так и написано. Иван Головач говорит, что полиморфизм в Java реализован с помощью наследования(то, что я показал в примере) и с помощью дженериков. Так вот, где же истина и как отвечать на собеседовании? Вскоре мне предстоит важное собеседование и не хочется опять облажаться на этом, казалось бы, элементарном вопросе.
  • ,

Почему NULL - это плохо?

Почему NULL – это плохо?


Вот простой пример использования NULL в Java:

public Employee getByName(String name) {
  int id = database.find(name);
  if (id == 0) {
    return null;
  }
  return new Employee(id);
}

Что не так с этим методом?

Он может вернуть NULL вместо объекта – вот что не так. Использование NULL – ужасная практика в ООП, и этого стоит избегать всеми способами. По данному вопросу уже опубликовано достаточно разных мнений, в том числе презентация Tony Hoare «Нулевые ссылки: Ошибка на миллиард долларов» и целая книга David West «Объектно ориентированное мышление».

Здесь я попытаюсь суммировать все доводы и показать примеры того, как можно избежать использования NULL, заменив его подходящими объектно-ориентированными конструкциями.

Сначала рассмотрим две возможные альтернативы NULL.
  • ,

super(name) вопрос. level15.lesson02.task04(ОСТОРОЖНО! ВНУТРИ РЕШЕНИЕ!)

Доброе время суток.
Столкнулся в задаче с таким:
public MarkTwainBook(String name) {
            super("Mark Twain");
            this.name = name;
        }

Лекцию пересмотрел, но ничего не упустил, как правильно называется данный момент и что загуглить?
Или если есть — то дайте, пожалуйста, линк на материал.
Уточню на всякий случай, что не ясно. Не ясно система конструкции и порядок действий кода в момент с присваиванием переменной author значения Mark Twain, т.е. попадает в конструктор новая книга с названием Tom Sawyer, как я раньше думал, то достаточно просто this.name = name, и внутри класса объявить переменной author = «Mark Twain», но так нельзя, я так понимаю, из-за конструктора в классе Book public Book(String Значение)? Делаем запись о том, что в author (который объявлен в book и унаследован) заносится запись Mark Twain касательно, далее по шаблону this.name = name — указываем имя книги. Я правильно понимаю? но хочется почитать не эту тему.

package com.javarush.test.level15.lesson02.task04;

/* ООП - книги
1. Создайте public static класс MarkTwainBook, который наследуется от Book. Имя автора [Mark Twain]. Параметр конструктора - имя книги.
2. В классе MarkTwainBook реализуйте все абстрактные методы.
3. Для метода getBook расширьте тип возвращаемого результата.
4. Создайте по аналогии AgathaChristieBook. Имя автора [Agatha Christie].
5. В классе Book реализуйте тело метода getOutputByBookType так, чтобы он возвращал:
5.1. agathaChristieOutput для книг Агаты Кристи;
5.2. markTwainOutput для книг Марка Твена.
*/

import java.util.LinkedList;
import java.util.List;
import java.util.Objects;

public class Solution {
    public static void main(String[] args) {
        List<Book> books = new LinkedList<Book>();
        books.add(new MarkTwainBook("Tom Sawyer"));
        books.add(new AgathaChristieBook("Hercule Poirot"));
        System.out.println(books);
    }

    public abstract static class Book {
        private String author;

        public Book(String author) {
            this.author = author;
        }

        public abstract Book getBook();

        public abstract String getName();

        private String getOutputByBookType() {
            String agathaChristieOutput = author + ", " + getBook().getName() + " is a detective";
            String markTwainOutput = getBook().getName() + " book was written by " + author;

            String output = " ";
            if(this instanceof MarkTwainBook){
                output = markTwainOutput;
            }
            if(this instanceof AgathaChristieBook){
                output = agathaChristieOutput;
            }

            return output;
        }

        public String toString() {
            return getOutputByBookType();
        }
    }
    public static class MarkTwainBook extends Book{
        private String name;
        public MarkTwainBook(String name) {
            super("Mark Twain");
            this.name = name;
        }

        public MarkTwainBook getBook(){
            return (MarkTwainBook) this;
        }

        public String getName(){
            return this.name;
        }

    }

    public static class AgathaChristieBook extends Book{
        private String name;
        public AgathaChristieBook(String name) {
            super("Agatha Christie");
            this.name = name;
        }

        public AgathaChristieBook getBook(){

            return (AgathaChristieBook) this;
        }

        public String getName(){
            return this.name;
        }
    }
}

Лучшие Муверы

Господа, совсем недавно мы запустили интересное направление под названием Муверы. Его смысл заключает в том, что один из учеников выбирает из предоставленного списка интересную тему, детально ее изучает и снимает по ней коротки видео доклад. Формат такого доклада – свободный. Кто-то просто записывает свой экран, показывает подготовленную презентацию и комментирует ее, кто-то что-то демонстрирует в среде разработки и т.д.

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

Что такое инкапсуляция? — vk.cc/2wNKOW
Горячие клавиши в Intellij IDEA — vk.cc/2wNLgN
Основы HTML — vk.cc/2wNOpb
Исключения (Exceptions) Часть 1 — vk.cc/2utac5
Исключения (Exceptions) Часть 2 — vk.cc/2wNM6r
Наследование — vk.cc/2wNMt4
Интерфейсы — vk.cc/2wNMY0
Что такое MVC? — vk.cc/2wNNZa
Оператор for-each — vk.cc/2wNOSO
Типы переменных и классы объектов vk.cc/2wNVEe

Смотрите, комментируйте, подписывайтесь на канал и не забывайте снимать и присылать новые Муверы. (все ролики присылайте Бендеру — vk.com/javarush_bender).

Такой формат дополнительной подготовки и обмена информацией чрезвычайно полезен, поэтому отбросьте все сомнения и действуйте!

Список заявленных тем можете найти здесь – vk.cc/2rwrOc

Если вы хотите выбрать свою тему связанную с Java – здорово, все будут только рады.
  • ,

Творческая ООП задача

Реализовать наследование, инкапсуляцию и полиморфизм в классах, наследуемых от базового класса Mouse. В main реализовать объекты.
//Как-то так…

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

Если этого ежа,
Нос заткнув, чтоб не дышал,
Где поглубже, бросить в речку
Вы получите ерша.

Если этого ерша,
Головой в тисках зажав,
Посильней тянуть за хвост
Вы получите ужа.

Если этого ужа,
Приготовив два ножа…
Впрочем, он наверно сдохнет,
Но идея хороша!