Категория ‘ПИК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 метода). Същото вършат и хората - те сготвят храната и гледат купичката. Ако тя е пълна, те се отдръпват и чакат. Поддържат се броячи за броя на активните кучета и активните готвачи. Ако готвачите станат повече от кучетата, някой от готвачите ще спира работата си. Прочети още...