Интерфейсы - маркеры

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

Предположим, что нам понадобилось сохранить состояние объекта в памяти, а потом
еще и иметь воззможность расшифровать то, что мы сохранили. Тогда, скажите вы, можно
перевести наш объект в набор битов. Верно.

Мы можем использоватьпростой способ записи в файл с помощью FileInputStream, но это
удобно только если объектов мало, а что если их много?
Для этого есть чудесный инструмент сериализации.
Главное правило, когда вы им пользуетесь — сериализуемый объект должен
содержать в себе все данные, а не ссылаться на другие объекты.

Смотрите на свой класс " Ага, не ссылаются поля и хорошо поставлю маркер Serializable".
А когда поставите, это будет значить, что объекты, которые вы пометили могут быть записаны
в ObjectOutputStream. У класса ObjectOutputStream есть метод writeObject0(),
а в нем находятся проверки instanceof, проверяющие можно ли записывать объект и если вся серия проверок проваливается, то выбрасывается исключение NotSerializableException, а если нет- все аккуратненько пишется в память.

Создадим класс BigObject, экземпляры которого будем сериализовывать


    package post1;
    import java.io.Serializable;

    public class BigObject implements Serializable {

        private int id;
        public void setId(final int id){
            this.id = id;
        }

        public int getId() {
           return id;
        }
    }


Класс BigObject уже помечен как Serializable. У него есть одно поле id и сопутствующие методы get/set.

package post1;
    import post1.BigObject;
    import java.io.*;
    
    public class InterfaceMarker  {

        public static void main(String[] args) throws IOException, ClassNotFoundException {
            int originalId = 12;
            BigObject objectOriginal = new BigObject();
            objectOriginal.setId(originalId);
            ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream();
            ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer);
            outputStream.writeObject(objectOriginal);
            outputStream.close();

            byte[] buffer = writeBuffer.toByteArray();
            ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer);
            ObjectInputStream inputStream = new ObjectInputStream(readBuffer);
            BigObject objectCopy = (BigObject)inputStream.readObject();
            if (objectCopy.getId() == originalId)
                System.out.println( "originalId equals copiedId");
        }
    }

Запись объекта


В начале создаем объект сериализируемого класса BigObject, затем готовим под него буфер данных — место куда все бантики будем складывать ByteArrayOutputStream. Затем готовим уже упомянутый ObjectOutputStream и передаем ему буфер.Записываем наш объект в поток и закрываем его.

Чтение объекта


Подготовим буфер записи readBuffer, передадим inputStream, прочтем readObject(). Теперь объект восстановлен.

Благодаря тому, что поле `id` не являлось ссылкой, мы смогли пометить Serializable класс, который полностью содержит в себе свои данные. Вместо того, чтобы добавлять функции проверки внутри нашего класса маркеры позволяют упростить процедуру валидации классов.
  • ,

Свой проект

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

Типичные ошибки начинающих программистов

Не так давно пробовал устраиваться на работу тестировщиком Java(мой текущий уровень — 19). Получил следующий фидбек:

К сожалению, есть ошибки в задании. Ниже фидбек от нашего специалиста:

Неявная логика в методах
Отсутствие иерархии, неумение сравнивать объекты по типу
Недостаточное знакомство с базовыми вещами в Java
Исользование громоздких конструкторов вида CLEANER (false, false, true, false, false, false, false)
Спагетти-код там, где можно было упростить логику

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

Если кому-то интересен мой код — github.com/vozni4iy/office

Подготовка к онлайн тестированию на Java

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

Программирование – тяжёлая работа или лёгкий способ срубить денег?

Хорошая мотивирующая (или наоборот?) статья.
Выложил, что бы побольше людей ее прочитало. Автор не против. :)


! Статья про enterprise :) Не android.

Как стать Java разработчиком?

1. Нужно ли это Мне?

Видимо, самый важный пункт. В связи с экономическим кризисом, многие люди пытаются найти способ обеспечить себя финансово. А тут появляется “IT”, в котором все получают много денег за то, что могут написать 10 строк кода. К тому же, “программирование – это легко”.

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

В первую очередь, необходимо помнить, что разработчик программного обеспечения – это инженер. Поэтому и требования соответствующие.

Во-вторых нужно понимать, что именно представляет из себя работа программиста? Прежде всего – это перманентное решение проблем. У Вас не будет момента, когда все проблемы будут решены. Это процесс постоянный. Во-вторых – это огромное количество рутинной работы, выполнять которую по 3-4 часа в день без любви к делу, если не невожможно, то уж точно требует огромного усилия над собой.

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

2. Что именно необходимо для того, чтобы называться Java-разработчиком?

Для того, чтобы Вы с гордостью могли назвать Себя Java Developer с больше буквы “J” необходимо иметь, хотя бы, общее понимание следующих вещей:

Синтаксис языка, а именно – Java Core;
Основы Объекто-ориентированного программирования;
Основы баз данных (SQL);
JDBC;
Servlets + JSP;
ORM (например, Hibernate);
Любой популярный Web – Framework (например, Spring);
HTML, CSS, JavaScript;
VCS (GIT, SVM или подобное).
Теперь, пройдёмся по пунктам:


Java Core

Сюда входит знание и понимание иерархии классов в Java, методы класса Object и, конечно Collection Framework. Какие интерфейсы, кто и кого имплементирует и т.д.

Вот эту картинку, java-разработчик должен нарисовать в 3 утра под арт-обстрелом:



В изучении Java Core помогут такие книги, как:

Java 8. Полное руководство (Шилтд)
Философия Java (Эккель)
И конечно же, никуда не деться от

Java Platform API Specification

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

ООП

От новичка не требуется больше, чем знание и понимание трёх принципов ООП (некоторые считают, что их 4, но тут уж как попадёте и это не так существенно).

Умение на практическом примере объяснить каждый из них.

Основы баз данных и SQL

MySQL 5.0 (Виктор Гольцман)

Эта книга легко и доступно объясняет базовые понятия с илюстрацей примеров и пошаговыми инструкциями.

JDBC

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

JDBC 4.1 Specification наиболее полно раскрывает все особенности работы JDBC.

Servlets + JSP

В книгах по Шилтда и Эккель Servlet-ы описываются “вскольз”, для более глубокого понимания, что же это такое необходимо изучить что-то по-серьёзнее.

Java Servlet Specification
и
JavaServer Pages Specification
Эти две спецификации дают исчерпывающее понимание тих технологий.

Как JDBC, так и Servlets используются разработчиками в повседневной работе только в редких случаях. Но они лежат в основе всех популярных Framework-ов и понимание того, как эти framework-и утроены “внутри” поможет Вам избежать очень многих глупых ошибок, которые допускают те, кто изучал только framework-и.

Hibernate

Книга, которая является гордостью мира Java – это Java Persistence with Hibernate.

Многие разработчики, которые используют другие технологии (в частности C#), читают эту книгу для того, чтобы глубже понять что такое ORM и какие проблемы оно решает.

Если Вы умеете созлать отношения one-to-one, one-to-many и many-to-one и написать простой запрос на HQL – ваших знаний хватит для уровня новичка.

Web – Framework (например, Spring)

После того, как освоено всё, что есть выше можно уже замахнуться на Spring. Для начала написать простое CRUD приложение, а потом узнать, что такое Spring Pet Clinic. Теперь Ваших знаний будет достаточно для того, чтобы с пониманием происходящего создавать более-менее пристойное приложение, которое ходит в базу данных, что-то там делает и т.д. и т.п.

Поздравляю, теперь Вы можете написать то, что можно уже и “потрогать” и показать.

Через 5-6 месяцев, Вы захотите удалить этот код и сделать так, чтобы никто не знал, что именно Вы его автор, но пока это хорошо :)

HTML, CSS, JavaScript

Здесь всё просто и не интересно. Обычная вёрстка, которая для back-end разработчика не представляет особго интереса. Это хлеб front-end-щиков.

Но базовое понимание всего этого быть должно.

HTML Academy

HTML Book

Основы JavaScript

Этого Вам хватит с головой.

VCS

Любой проект, в котором работает больше 0 разработчиков не делается без СКВ (системы контроля версий). GIT – наиболее удобная и часто применяемая, конкурирует с ней SVN. Будете знать одну из них – и будет Вам счастье.

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

Важно понимать, что спрос на новичков крайне низкий, несмотря на все попытки показать, что программистов не хватает. Не хватает высококвалифицированных разработчиков с опытом работы от 3-х лет, а новичков с избытком.

Для того, чтобы зацепиться и “войти в IT” Вам поможет адский труд в течение от 6 месяцев до 1 года. Но если это Ваше и Вы готовы для этого вложить такое количество усилий, то дерзайте.

Удачи Вам!

От себя хотел бы добавить, что реально для изучения java core ничего лучше javarush, по-крайней мере в рунете — нет. ИМХО.

Всем удачи еще раз.


Статья: proselyte.net/how-to-become-java-developer/
Автор: proselyte.net/faq/

Задачи окружающего мира решаемые Java

Прим. автора поста: Перевод местами сделан не совсем гладко. В попытке сгладить шероховатости, были сделаны вольные дополнения, которые нисколько не портят смысл статьи. Оригинал статьи вот здесь
Целевая аудитория статьи — люди, которые колеблются пуститься в плавание в мире Java.


Редакция dzone.com побеседовала с 11 профессионалами в бизнесе, плотно работающих большую часть, если не больше, свой карьеры в экосистеме Java. Спросили их о задачах в реальном мире, которые решаются Java.
  • ,

Java и xml

Доброго времени суток!
Прошу помощи, интересует вопрос по работе с XML, необходимо чтобы программа выгружала информацию в формате XML, имеется XCD схема. Пытался разобрать схему на классы, получилось, но что делать дальше не пойму. Подскажите пожалуйста или порекомендуйте какие-нибудь мувики, в интернете ничего дельного по данной теме не нашел.

Java-конференция для разработчиков

⚠ Интересное мероприятие от наших партнеров

Если вы подписаны на нас больше пары месяцев, вы знаете, что мы любим мотивировать писать код: утром, днем, вечером, ночью, – неважно! Важно то, что сегодня мы ловим исключение!
Если вы находитесь на 20+ уровне, то в пятницу-субботу на этой неделе мы советуем вам погрузиться в мир Java – 22-23 апреля состоится главная в России Java-конференция для разработчиков JPoint 2016: javapoint.ru/

И если Java вам реально интересна, пропускать нельзя: 50 докладов и 1000 единомышленников – конференции открывают второе дыхание для занятий и помогают взглянуть на задачи с нового ракурса.

А если вы еще не достигли высшего мастерства – то в воскресенье 24 апреля рекомендуем посетить студенческий день JPoint 2016 SD. В программе — 2 Java-чемпиона, разработчик JVM, разработчик Hazelcast, обладатель Duke's Choice Award и другие гуру мирового уровня, а также стенды работодателей и стажировки: students.javapoint.ru/
  • ,

level18.lesson10.home07

/* Поиск данных внутри файла
Считать с консоли имя файла
Найти в файле информацию, которая относится к заданному id, и вывести ее на экран в виде, в котором она записана в файле.
Программа запускается с одним параметром: id (int)
Закрыть потоки. Не использовать try-with-resources

В файле данные разделены пробелом и хранятся в следующей последовательности:
id productName price quantity

где id — int
productName — название товара, может содержать пробелы, String
price — цена, double
quantity — количество, int

Информация по каждому товару хранится в отдельной строке
*/

import java.io.*;

public class Solution {
    public static void main(String[] args) throws IOException
    {
        Integer argu = Integer.parseInt(args[0]); // Добавил такой костыль, т.к. в условии сказано что id - int
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        File file1 = new File(reader.readLine());
        BufferedReader readLineFromFile = new BufferedReader(new FileReader(file1));
        reader.close();
        String tmpStrFromFile;
        while ((tmpStrFromFile= readLineFromFile .readLine())!=null){
            if (tmpStrFromFile.charAt(0) == String.valueOf(argu).charAt(0) ){
                System.out.println(tmpStrFromFile);
            }
        }
        readLineFromFile .close();
    }
}

Что не так? Я не вижу просто, где тут несоответствие заданным условиям.

Это удивительно!

Привет всем!

Я хочу написать о том, что программирование это удивительно!

Сегодня на работе, еще не программистом, мне потребовалось обработать файл от 1000 (тысячи!) сотрудников, мне необходимо было собрать по ним по всем список ПО, которое стоит у них на компах.
В экселевском файле были огромные строки с большим количеством ПО, в этих строка были по разному разделены названия программ. И этих строк было 1200 (!).
Когда я впервые увидел файл, я, честно говоря, испугался. Такое количество тупой обработки, копипаст отсюда сюда. ЖЕСТЬ!

И тут руки сами потянулись к IDEA.
Я скопировал 1200 строк из опросника (экселевская колонка со списком программ) в текстовый документ.
Руки сами по себе накидали скрипт (спасибо за такое количество практики на курсе (!)).
Открыть файл
считать из файла
все поместить в TreeSet с новым компаратором, который не учитывает регистр
все вывести в другой файл.

В итоге 230 строчек, которые хоть и не были уникальны совершенно, но это 230 строчек АККУРАТНО уложенного и отсортированного списка программ вместо 1200 строк слипшегося, простите меня, плохо пахнущего вещества.
А так как все отсортировано, то похожие название уже рядом, и мне остается лишь немного доработать список вручную.
И все это за 1600 мс.
Меньше, чем за 2 секунды (!).
А я бы потратил на это перелопачивание руками часа 2 или 3, я бы возненавидел всех тех нерадивых сотрудников за такие списки, проклял бы тот день, когда я сел за баранку этого пылесоса.
А так 2 секунды.
Я ВОСХИЩЕН!

Спасибо всем тем, кто все это придумал. Множество умных людей все это создавали годами. Внутри Java огромные мощности. Фантастика!!!
Спасибо создателям курса за то, что научили этому всему.

Программирование РЕАЛЬНО облегчает жизнь людям.

p.s. буду дальше скрипт допиливать, чтобы сделать еще несколько отчетов по по этому ( а дальше еще будет) опроснику.
p.p.s. хочу для этой цели, если пойдет, освоить Apache Lucene, потому что есть еще одна задачка по поиску этих названий в базе. Поэтому, если кто захочет составить компанию, то с радостью поизучаю эту технологие в компании.
Также было бы здорово поработать с наставником.
  • ,

Вопрос по добавлению элементов в множество Set

Здравствуйте!

Недавно писал программу решения одной задачи в java, в ней в цикле шел перебор возможных решений. Решение представляет собой массив известной длины. Создал множество таких массивов solutions, в которое в цикле добавлял подходящие решения (они были в массиве sol):

solutions.add(sol);

Первое найденное решение добавлялось, а вот последующие уже нет. Первая мысль — решение повторяется, но нет, они все оригинальные… Решения стали добавляется после добавления процедуры clone():

solutions.add(sol.clone());

Почему первый вариант команды не добавлял элементы, а второй — добавлял?