Программирование и разработка ПО

Fruzenshtein аватар

  Задача для школьников vol. 1

8
Находится в разделах:

Нравится мне cloud-cuckoo, вот только обновляется редко... Посему решил сам сделать пост по теме Cool

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

  Задача от Amazon'a

24
Находится в разделах:

Given an array of n integers, find the sum of the most common integer.

Example: (2,4,5,6,4) – return 8 (as 4+4 = 8) .
(1,2,1,3,1) – return 3 (as 1+1+1 = 3).

max аватар

  Arrays.asList() и remove()

30
Находится в разделах:

Вы создали список с помощью

Поделали какие-то действия и решили удалить некий элемент из коллекции, скажем первый:

И тут внезапно:

max аватар

  Изменяемое состояние: опасности и борьба с ними

16
Находится в разделах:

 

1  Введение

Одно из ключевых отличий многих функциональных языков от объектно-ориентированных и процедурных — в поощрении использования неизменяемых данных; некоторые языки, в частности Haskell, даже не содержат в синтаксисе оператора присваивания! Апологеты функционального программирования объясняют это решение, в частности, тем, что отказ от изменяемых данных резко повышает корректность программ и делает их значительно более удобными для анализа с помощью формальных методов. Это действительно так, и в данной статье мы в этом убедимся. Однако полный отказ от изменяемых данных зачастую не оправдан по следующим причинам:

  1. Некоторые техники программирования, применяющиеся в функциональных языках без присваиваний (к примеру, ленивые вычисления), применимы в более традиционных языках, таких как Java или C++, лишь с огромным трудом.
  2. Для некоторых алгоритмов и структур данных не известно или не существует столь же эффективных аналогов без использования присваиваний (к примеру, для хэш-таблиц и систем непересекающихся множеств).
  3. Многие предметные области по своей сути содержат изменяемые объекты (например, банковские счета; элементы систем в задачах имитационного моделирования, и т. п.), и переформулировка задачи на язык неизменяемых объектов может «извратить» задачу.

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

max аватар

  Java Советы

19
max аватар

  Почему нельзя обернуть вызов super() блоком try/catch?

51

В Java, первой строкой конструктора должен быть вызов super() - будь он неявным, в случае конструктора по умолчанию, без параметров, или в случае переопределенного конструктора с аргументами. Возникает вопрос, почему же нельзя обернуть вызов конструктора класса-предка в try/catch?

Все дело в том, что если конструктор суперкласса спровоцирует исключительную ситуацию (exception), это будет означать невозможность создания объекта класса-наследника. Невозможно будет сделать вызов, скажем, toString() или equals(). А поскольку наследование - это расширение/переопределение существующего функционала, то в случае exception мы уже не сможем создать свой объект ввиду отсутствия того, что нужно расширять или переопределять.

max аватар

  Можно ли в java отловить Unchecked Exception в try/catch блоке?

43
Находится в разделах:

Во многих книгах написано, что Unchecked Exception не может быть отловлен в коде, то есть мы не можем использовать try/catch блок для ArrayIndexOfBoundsException, NullPointerException. Но, на самом деле, эти исключения могут быть отловлены в коде. 

Еще один интересный момент: можно ли использовать ключевое слово throw с Unchecked Exception? 

 

Единственное отличие между checked и unchecked исключениями заключается в том, что checked должны обязательно быть либо отловлены, либо прокинуты дальше, посредством объявления ключевого слова throws  в сигнатуре метода. 

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

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

 

max аватар

  Почему локальные вложенные классы имеют доступ только к final переменным?

44
Находится в разделах:

Наверняка, Вы встречали такое сообщение об ошибке от компилятора:

Согласно java language specification, вложенные классы внутри метода могут обращаться к переменным метода только при условии, что они объявлены final. 

Но к чему это ограничение, никто не задумывался? Какие проблемы несло бы использование не-final переменных?

Вот пример код для лучшего понимания ситуации:

max аватар

  Лучшая реализация синглтона - enum с одним элементом!

42
Находится в разделах:

Синглтон - это просто класс, объект которого создается лишь один раз. Они обычно представляют системный компонент, который является уникальным. Например, менеджер окон или файловая система. 

До релиза java 1.5, существовало два метода реализации синглтонов. Оба метода основывались на закрытом конструкторе и объявлении открытого статического метода для обеспечения доступа к объекту синглтона. В первом случае, объект был final полем класса:

Закрытый конструктор вызывается только один раз, для инициализации  публичного открытого поля Elvis.INSTANCE. Отсутствие публичного и защищенного конструкторов гарантирует лишь один объект: Класс Elvis создается единожды - не больше и не меньше. Хотя, есть один большой недостаток такого подхода - клиент с определенными привилегиями  может вызывать закрытый конструктор с использованием рефлексии с помощью метода AccessibleObject.setAccessible. Чтобы защититься от такой угрозы, необходимо модифицировать конструктор таким образом, чтобы он выбрасывал исключение при попытке создать второй экземпляр. 

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

max аватар

  Используйте шаблон 'Builder' в случае наличия большого количества аргументов конструктора

36
Находится в разделах:

      Статические фабрики и конструкторы имеют общее ограничение: они плохо масштабируются при большом количестве опциональных (необязательных) аргументов.

Рассмотрим случай класса, описывающего состав продукта, который обычно можно найти на любом продукте в магазине. Допустим, на  этикетке продукта обозначены размер (емкость), количество элементов в упаковке, калории в 1 шт. и более двадцати других параметров: жирность, наличие соды и т.д. Большинство продуктов имеют нулевые значения для необязательных полей. Какие типы конструкторов или статических методов Вы бы выбрали для такого класса? Традиционно, программисты использовали шаблон "Телескопического конструктора". Суть его в следующем :в одном конструкторе  вы описываете в конструкторе только необходимые параметры, в другом - необходимые + 1 необязательный; в третьем - необходимые + 2 необязательных и т.д. В итоге, класс превращается в конструкторного монстра. 

Вот как это выглядит на практике:

max аватар

  Используйте статические фабричные методы вместо конструкторов

36
Находится в разделах:

    Стандартным способом создания объектов класса является использование открытых (public) конструкторов. Однако, существует и другая техника, которую должен знать каждый разработчик.

Класс может объявить статический фабричный метод (static factory method), который будет возвращать объект класса.

    В качестве простого примера можно рассмотреть класс Boolean (враппер над примитивом boolean). Этот метод транслирует boolean в ссылку на объект Boolean:

Статические фабричные методы имеют свои преимущества и недостатки.

 

Преимущества статических фабричных методов

 

Первым преимуществом является наличие имен у методов.

Если параметры конструктора не описывают объект, который возвращают, то статический метод с хорошо подобранным именем будет более читабелен. Класс может иметь только один конструктор

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

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

с таким классом придется часто обращаться к документации (если конечно она существует).

 

max аватар

  Java .class file version или под какую джаву скомпилирован класс?

42
Находится в разделах:

Часто бывает необходимо узнать версию бинарного .class файла. 

Например, web/application сервер крутится под пятой джавой, а локально установлена шестая джава. В итоге, с виду, проблему выявить непросто. 

Имея .class file и штатные средства jdk, можно быстро и качественно получить информацию о скомпилированном классе. 

В папке jdk/bin есть отличная тулза javap

С ее помощью, введя в командной строке такую строчку

 

Получим результат:

max аватар

  Java Collection Framework

16
Unpublished
Находится в разделах:

 

Коллекция или контейнер - это объект, который группирует объекты в один модуль. Коллекции используются для 

 

хранения,получения, манипулирования и аггрегирования данными. 

 

Что такое Collections Framework?

Это унифицированная архитектура, представляющая коллекции. Например, в С++ есть отличный фреймворк коллекций - 

 

Standard Template Library (STL). Исторически так повелось, что фреймворки коллекций всегда считались достаточно 

 

сложными и объемными. Их знание всегда создавало программисту отличную репутацию. В джаве же, Collection Framework 

 

разрушил эту традицию. Он предоставляет исчерпывающий набор реализаций всевозможных структур данных из теории 

 

компьютерных наук.

  Играем в компилятор. Часть 3.

36
Находится в разделах:

У Вас есть следующий код:

 

 

Данный код выдаст ошибку на этапе компиляции:

 

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
    Type mismatch: cannot convert from int to byte

    at Test.main(Test.java:6).

 

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

То есть вот так:

 

Однако, это не единственное решение. Wink

 

Какие варианты можете предложить Вы?

  Вопрос: Восходящее преобразование и generic

44

Давеча на собеседовании был озвучен вопрос:

Можно ли при определении generic коллекции указать типом переменной коллекцию класса-предка, а проинициализировать ее как коллекцию класса-потомка?

Т.е. можно ли сделать так:

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

Заполнить generic-коллекцию класса-предка объектами класса-потомка таким образом вручную возможно? Возможно:

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

 

Альтернатива, которую нам предлагают, довольна неуклюжая:

Вопрос, что же помешало разработчикам сделать более короткую запись, т.е. автоматическое "восходящее преобразование generic коллекций"? Лежит же на поверхности...

  Legal identifiers in Java.

68
Находится в разделах:

В этой статье я собственной рукой написал следующее:

"Идентификатор может содержать один или несколько символов. Имя переменной может начинаться с любой буквы, знака подчеркивания или символа $. Далее могут следовать буквы, цифры, знак $ или символ подчеркивания...."

Сейчас, я понимаю, что это не совсем правдаLaughing

 

Неточность содержится в вот этих двух словах:

"..знака подчеркивания..."

 

На самом деле, идентификатор переменной может содержать любой обьединяющий символ ( connecting character), например, нижнее подчеркивание (_).

А вот сам список этих же самых объединяющих символов: http://www.fileformat.info/info/unicode/category/Pc/list.htm. 

 

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

 


  Java puzzler. Part 1.

68
Находится в разделах:

Сегодня в сети нашел pdf с java головоломками.

В доке 9 примеров. Ни автор, ни издательство не указано...

Как правило, если я и выкладываю что то типа головоломок-вопросов, то это все исключительно моего авторства. :)

Однако, сейчас попробую выложить примеры из pdf.

Не знаю, насколько это правильно и интересно ли кому либо... Можете оставить отзыв по этому поводу в коментах.

 

С лирической частью закончили, вперед,  puzzler 1:


The following program adds two hexadecimal, or “hex,” literals and prints the
result in hex. What does the program print? (какой резульат будет выведен в консоль?)

 

 

  Elementary Java.

69
Находится в разделах:

Вот еще одна задачка, которая затрагивает основы основ:

 

 

 

Как Вы думаете, какие значения будут выведены в консоль? 

 

P.S. ну только же не надо сразу бежать открывать Eclipse...Laughing

  Играем в компилятор. Часть 2.

68

Сразу же в догонку к первому посту еще одна задачка, правда уже на порядок проще.

 

Есть у Вас вот такой код: 

 

Представляем себя компилятором.... и оглашаем вердикт: работоспособен код или нет. Laughing

  Играем в компилятор.

73
Находится в разделах:

Есть вот такой код:

 

 

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

 

Если нет, то, почему? Laughing