Ответы пользователя по тегу Java
  • Как подружить C# и Java?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Ответ написан
    Комментировать
  • Как можно подключать плагины к приложению на java?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Нужно написать гуишное приложение с возможностью подключать модули (то есть плагины). Причём программа не должна перезапускаться при их подключение (должно всё применяться сразу же).

    Java по счастливому стечению обстоятельств умеет подгружать классы динамически:
    // Где-то там, где реализуется плагин 
    class MyClass implements MyPluginInterface {}
    
    // У нас тут, в модульной софтинке
    try { 
        Class c = Class.forName("com.vasyapupkin.MyClass"); 
    } catch (ClassNotFoundException e) {
        // log error
    }

    Затем, посредством рефлекшна, вы можете создавать экземпляры вашего типа:

    MyPluginInterface plugin = (MyPluginInterface) с.newInstance();


    При подключении плагина будет изменяться главная форма программы, то есть будут появляться какие-то кнопки, поля и прочее.

    Ваша софтинка должна как-то отслеживать появление файлов. В простейшем случае - ждать появление файлов где-то по classpath, чтобы попытаться выудить новые классы. В простейшем случае классы могут быть наследниками GUI-компонентов (т.е. уметь себя рисовать) и вы можете просто вставлять их экземпляры в заранее известный контейнер.

    ЗЫ Можно делать свой велосипед, но такая технология в Java уже существует из коробки - JavaBeans и, если вы хотите препода довести до экстаза, то стоит копать в этом направлении.
    Ответ написан
    4 комментария
  • В чём отличия и сходства паттернов Adapter, Decorator, Wrapper и Proxy?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Адаптор - частный случай декоратора. Отличие скорее в том, что декоратор может быть масштабнее (содержать в себе много сущностей, в то время как адаптор, как правило, реализует интерфейс для определенного типа).

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

    Оберткой может быть любая агрегация, это общее понятие, грубо можно предыдущие типы назвать (реализовать) обертками. Но чаще это означает дополнение оборачиваемого объекта какими-либо данными. Допустим, метаинформацией.
    Ответ написан
  • Java Servlet Правилен ли подход?

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

    Да. Похожим образом работает, например DispatcherServlet из Spring MVC:
    где FrontController - это такой сервлет.
    mvc.png
    Ответ написан
    Комментировать
  • Как отслеживать клиентские запросы к сервлету?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Servlet Filters на UI-уровне, либо интерцепторы (на уровне бизнес-логики).
    Ответ написан
    Комментировать
  • Какова производительность cast в Java?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    best practices в таких случаях - не кастовать, а пользоваться полиморфизмом. Ведь декораторы нужны, чтобы что-то декорировать/абстрагировать, а не вытаскивать из них кишки конкретной реализации с помощью каста.
    Ответ написан
    2 комментария
  • Как правильно использовать инкапсуляцию в Page Object паттерне?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    инкапсуляция доходит до абсурда, и придется писать геттеры под каждый элемент или методы вроде addToCartButtonClick().


    Поддерживать ООП с SOLID и прочими DRY - это вообще не особо удобно, а что поделать?)

    Другое дело, что вместо addToCartButtonClick должен быть метод addProductToChart, где PageObject уже решит, что ему нужно: кнопку нажать, ползунок потянуть и т.п., тогда это можно будет назвать инкапсуляцией и пропадёт абсурдность.

    Если вам не нужны геттеры под каждый элемент, то делайте их private. Очевидно, что хороший ООП-код старается в классе как можно больше скрыть, сделать статическим и константным, а пользователю выставить лишь необходимое и достаточное для решения его задач
    Ответ написан
    Комментировать
  • Раннее и позднее связывание Java?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Этим и полезно знание знакомство с C++ (=

    Суть в чем: куда-то в память загружается объект-тип (не экземпляр с данными, а именно представление типа), в котором физически располагается код методов. У каждого экземпляра классов есть ссылка на свой объект-тип. Когда тип ссылки на объект совпадает с его типом, то все просто: мы знаем, что метод можно найти напрямую. Открываются перспективы для оптимизации компилятора: подстановка конкретного адреса метода или даже инлайнинг (когда вызов метода заменяется непосредственно на код из метода, чтобы не тратить такты на передачу параметров). Это раннее связывание.
    Если же у нас возможен полиморфный вызов (переменная-ссылка может указывать на объект-наследник, у которого может быть переопределение родительского метода), то нужно узнать точно какого типа объект, чтобы вызвать подходящее определение метода из нужного типа. Увы, это мы узнаем только в рантайме, поэтому компилятор не поможет оптимизировать этот процесс. Это позднее связывание.

    Во многих Си-подобных языках (C++, C# и т.п.) в угоду производительности используется раннее связывание по умолчанию: полиморфные методы должны явно помечаться программистом ключевым словом virtual (иначе будет вызываться метод из типа переменной-ссылки, не полиморфно), в Java же в угоду читаемости кода используется позднее связывание по умолчанию: все методы неявно "virtual", так что качество связывания отдается на откуп компилятору.
    Конечно, есть возможность пометить метод ключевым словом final, что запретит переопределять метод в наследниках, т.е. у компилятора появятся все полномочия жестко вбить необходимый адрес метода в точку вызова без страха, ибо альтернативных версий метода в наследниках просто быть не может.
    (В С++11 также есть ключевое слово final, а в C# - sealed)
    Ответ написан
    1 комментарий
  • Java Exceptions. Что делать с большим количеством исключений?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    На разных логических уровнях можно (и нужно) делать re-throw более общих типов исключений (с ссылкой на оригинал внутри), если нет возможности их обработать на месте. Например, TooLongNameException и NegativePriceException где-то выше станут ModelValidationException, т.е. там вам достаточно знать, что модель кривая, вне зависимости от того, по какой причине это произошло.

    Может быть пример не самый удачный, ибо здесь наследование бы подошло. А вообще, большой список исключений - это косвенный признак того, что метод слишком много делает (S - SOLID).
    Ответ написан
    Комментировать
  • Зачем мне все-таки maven?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    но я бы это и так мог сделать по идее

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

    А для хэлловордов это все не нужно, да.
    Ответ написан
    Комментировать
  • Как остановить параллельное выполнение?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    У треда должна быть обертка, в которой будет булево свойство (interruptionRequested, например), которую треду необходимо проверять самостоятельно между атомарными операциями своей полезной нагрузки. ("Скопировал файл, проверил - false, скопировал следующий, проверил - false, скопировал еще один, проверил - true, завершился").

    То есть тред сам решает, когда ему остановится, но мы можем посигналить ему об этом. Иначе мы рискуем поломать данные, т.к. не будем наверняка знать, в каком состоянии они находятся.
    Ответ написан
    Комментировать
  • Помощь в объяснении логики функции?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    1) if ( *originalName ) при каких условиях оно срабатывает\не срабатывает.

    Срабатывает, когда значение под указателем отличается от 0, не срабатывает - в противном случае.

    2) while ( v6 ) как оно считает что пора бы и закончить?

    Когда значение v6 становится равно 0.

    3) v6 = (originalName++)[1] я так понимаю что тут берется первый элемент из originalName?

    Второй элемент, относительно текущей позиции указателя originalName (до инкремента).

    4) unsigned __int16 есть ли аналог этому типу в jav'е?

    Прямых аналогов нет (беззнаковых типов в принципе), но long вместит все его значения.
    Ответ написан
  • Как приостановить цикл в Java?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    По-хорошему, тяжелую логику (а вызовы sleep можно назвать тяжелой задачей, т.к. это тормозит поток, который не сможет обрабатывать события интерфейса) нужно выносить в отдельный поток (thread), GUI-поток должен вести себя пассивно и заниматься лишь взаимодействием с пользователем и запусками background worker'ов (для длительных операций).

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

    Если английский средней школы позволяет, советую пройти вот этот туториал.
    Ответ написан
    Комментировать
  • Как присоединить Базу данных к своему проекту на GitHub?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    В простейшем случае можно рядом (допустим, в папке Database) просто положить CREATE-скрипт. Для портфолио этого достаточно.

    Для активно "живущего проекта" с пользователями, подразумевающего какие-то патчи и новые версии, хорошо бы также рядом класть скрипты миграции (которые обновлять в том же коммите, где это имеет значение), которые помогали бы пользователям в пару кликов актуализировать структуру БД без ущерба для их данных. Скрипты эти должны отталкиваться от начального состояния базы (обновляться инкрементально).
    Ответ написан
  • Почему при сворачивании окна пропадают все нарисованное на фрейме?

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

    public class MyPanel extends JPanel {
        public void paint(Graphics g) {
            // do your painting here
        }
    }
    Ответ написан
  • Как сделать цепочки в наследующих классах java?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Переопределяйте базовые методы.
    Ответ написан
    Комментировать
  • В Java при роботе с filter, map и т.д. нужно вызывать метод stream(). Зачем и почему так спроектировано?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    В Java нет методов расширения, потому на коллекцию можно "навешивать" функциональность аналогичным образом (C#/LINQ), оборачивая коллекцию в Stream<T>.
    Ответ написан
    Комментировать
  • Правильно ли создавать коллекцию типа интерфейс?

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

    Так принято в Java. Но за полиморфный вызов вы платите рантаймовыми тормозилками. Потому без особого смысла этого стоит избегать.
    Ответ написан
    Комментировать
  • Java. Как корректно организовать взаимодествие с сетью?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Так или иначе придется проверять наличие данных (это может быть скрыто за механизмом асинхронного вызова, но суть будет та же - eventloop). Продолжительностью sleep вы можете искать баланс между скоростью отклика и занимаемыми ресурсами.
    Ответ написан
    Комментировать
  • Есть сообщение с полем типа string, могу ли я анализировать это поле?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    if(value.equals("OK"))  { ... }
    
    switch(value) {
        case "OK": ... break;
        case "Error": ... break;
    }

    Строковых параметров для проверки некоторого ограниченного списка значений лучше избегать (нужно будет предусматривать ситуации с разными кейсами, пробелами внутри, опечатками, которые не отследить при компиляции и прочее), вместо них можно использовать boolean или enum-типы (если больше двух значений).

    enum Status {
        Ok,
        Error,
        Warning
    }
    
    class Foo {
        static void bar(Status status) {
            if (status == Status.Ok) {
                ... 
            }
            ...
        }
    }
    Ответ написан
    9 комментариев