C, PHP, VB, .NET

Дневникът на Филип Петров


Категория ‘ПИК3 Java’

* Затваряния (Closures)

Публикувано на 12 март 2015 в раздел ПИК3 Java.

Един интересен момент при писането на локални класове е свързан с достъпа до променливи и обекти, които са извън блока дефиниращ локалния клас. Оказва се, че локалните класове (и анонимните в частност) имат достъп до локални променливи и референции към обекти, които са извън техния обхват. Това важи също така и за новия по-модерен вариант с ламбда изрази в Java 8 (те са анонимни класове в крайна сметка). Има обаче едно сериозно ограничение – променливите или референциите трябва да са final. Нека дадем един първи елементарен пример: Прочети още…

.

 


* Вградени функционални интерфейси

Публикувано на 11 март 2015 в раздел ПИК3 Java.

В Java 8 има една поредица от вградени функционални интерфейси, които имат важна роля при използването на ламбда изрази в библиотечните функции. Използването на тези интерфейси е силно насърчително (вместо създаването на собствени еквивалентни такива). В предишната статия вече говорихме за добре познатите Comparator, ActionListener и Runnable. Сега ще обърнем внимание на някои от новите интерфейси, които идват с Java 8. Прочети още…

.

 


* Методи по подразбиране

Публикувано на 07 март 2015 в раздел ПИК3 Java.

Както вече знаем, ламбда изразите работят само и единствено с функционални интерфейси. Това е логично, защото ако един интерфейс има повече от един метод, компилатора няма как да знае кой от методите да използва при конвертирането на ламбда израза. Това е нормално и не подлежи на коментар. Интересен е обаче въпроса как да разширим съществуващи интерфейси, като им добавим допълнителни методи, които да могат да работят с ламбда изрази. Прочети още…

.

 


* Ламбда изрази

Публикувано на 06 март 2015 в раздел ПИК3 Java.

Ламбда изразите са функционалност, която е дълго чакана в Java. Появява се с версия Java 8 и е първата крачка към добавяне на… нека не казваме „елементи“, а по-скоро „еквиваленти“ на функционално програмиране в езика. При положение, че един от основните конкуренти на Java – .Net framework – ги поддържа още с версия 3.5 от 2007 г., може да се каже, че от Oracle (Sun) са доста закъснели. Разбира се това си има и причина – до известна степен ламбда изразите нарушават основната философия на абстрактния модел на интерфейсите в Java (за това няма да пишем сега, а в следваща статия по-подробно). Тук ще разгледаме общата философия на ламбда изразите и начина на работа с тях. Прочети още…

.

 


* Задача от контролно 1, вариант 2, 22 ноември 2014 г.

Публикувано на 22 ноември 2014 в раздел ПИК3 Java.

Задача 1. Създайте клас за филми (Movie) с член променливи име (name – тип String), времетраене в секунди (length – int) и трейлър (trailer – FileInputStream). Минималният брой на секундите в един филм трябва да e 3600. Създайте само един конструктор – с подадени параметри.

Задача 2. В клас Movie добавете следните методи: Прочети още…

.

 


* Задача от контролно 1, вариант 1, 22 ноември 2014 г.

Публикувано на 22 ноември 2014 в раздел ПИК3 Java.

Това е набързо написано (като за контролно :P) примерно решение на задачата от днешната контролна работа. Вероятно може много неща по него да се изгладят. Не е тествано въобще с реални данни – може да не е съвсем коректно. Моля ако някой има време, да го изпробва и да каже ако и къде има проблеми. Изтеглете сорс кода.

Задача 1. Създайте клас за фотоалбум (PhotoAlbum) с член променливи „брой страници“ (pagesCount – тип int) и списък от снимки (масив photos от тип FileInputStream). Максималният брой на снимките в един албум не трябва да превишава pagesCount*3 – това трябва да са границите на масива. Погрижете се новосъздаден фотоалбум да има минимум 10 страници. Освен конструктор с подадени параметри, трябва да създадете и конструктор по подразбиране, в който се създава нов празен албум с 16 страници. Прочети още…

.

 


* Игра на камъчета с трима играчи – сървър и клиент

Публикувано на 26 януари 2014 в раздел ПИК3 Java.

Трябва да се моделира комбинаторната игра камъчета (stones). Играта се играе от трима играчи и се състои в следното: Прочети още…

.

 


* Tic-tac-toe сървър и клиент

Публикувано на 26 януари 2014 в раздел ПИК3 Java.

Трябва да се създаде сървър за игра на “морски шах” (tic-tac-toe). Играта се играе от двама души върху дъска с девет квадратчета. Първият играч отбелязва знак „Х“ в квадратче по негов избор, след което втория отбелязва знак „О“ и така се редуват до изчерпване на квадратчетата. Целта е един от играчите да подреди три от неговите знаци по хоризонтала, вертикала или диагонал. Примерни изходи от играта са следните: Прочети още…

.

 


* Чат сървър и клиент с GUI

Публикувано на 17 декември 2013 в раздел ПИК3 Java.

В това упражнение беше показано как може да се изгради графичен интерфейс за чат клиент приложението от предишното упражнение. Използва се Swing, като се използват различни контроли – JLabel, JTextArea, JScrollPane, JTextField и JButton. Освен допълнителния клас (ClientGUI) има промени по другите два – в ClientThread всички System.out.println са променени така, че да обновяват графичните контроли, а в основния клас Client e премахната функционалността за четене на съобщение от клавиатурата чрез конзолата (тази дейност е прехвърлена към действието на бутона). Промени по сървъра няма и той продължава да си работи в конзолен режим. Демонстрирани са два често използвани Layouts – FlowLayout и BorderLayout – за разполагане на контролите. Не на последно място – използва се Event Dispatch Thread (EDT) чрез SwingUtilities.invokeLater(…), за да се прави синхронизирано обновяване на информацията по графичния интерфейс. Прочети още…

.

 


* Consumer-Producer – двустранна синхронизация с много консуматори и много производители

Публикувано на 29 ноември 2013 в раздел ПИК3 Java.

В предишните примери се забеляза нещо много неприятно – кодът се обърква все повече и повече. Причината за това е, че при множество играчи, не само производителя трябва да уведомява консуматора и обратно, а и самите консуматори и самите производители трябва да се синхронизират помежду си. Поради тази причина ще е по-добре ако оптимизираме идеята за централно синхронизиране на всички чрез „чинията“.

В този пример има споделен ресурс – чиния с храна. За нея има ограничение какво количество храна ще поеме – максимум 10 единици (по този начин усложняваме задачата, защото хората трябва да се изчакват!). Кучетата ще нападат чинията в произволен ред. Ако в нея няма храна, кучето се отдръпва, за да даде възможност на човек да добави храна (има continue в цикъла на run метода). Същото вършат и хората – те сготвят храната и гледат купичката. Ако тя е пълна, те се отдръпват и чакат. Поддържат се броячи за броя на активните кучета и активните готвачи. Ако готвачите станат повече от кучетата, някой от готвачите ще спира работата си. Прочети още…

.