Ответы пользователя по тегу Java
  • Инкапсуляция, отсутствие её - проблема?

    @bromzh
    Drugs-driven development
    Да нет особой проблемы. Просто ответственность за правильное использование апи перекладывается с разработчика апи на разработчика, использующего это апи.

    Ну и к слову: наследование классов нарушает инкапсуляцию (для protected-полей и методов). А приватные поля/методы можно спокойно получить через рефлексию.
    Вообще, инкапсуляция в виде модификаторов доступа - так себе. Лучше это реализовывать через замыкания и контексты. Но в java такого нет (и не будет). Так что и так сойдёт.
    Ответ написан
  • Как подключить базу данных MySQL к Java-приложению?

    @bromzh
    Drugs-driven development
    Sqlite там, а не мускуль. Его и бери.
    Ответ написан
    Комментировать
  • Как получить данные из потоков обратно в main в java?

    @bromzh
    Drugs-driven development
    Можно использовать Future. Ну или синхронизацию.
    Кстати, для многопоточности надо использовать контейнеры, которые специально заточе.... А судя по приведённому коду, тебе нужно почитать литературу по многопоточности в java, а не спрашивать тут такие вещи. Тогда и таких вопросов не будет возникать.
    Ответ написан
    2 комментария
  • Как в Java преобразовать математическую функцию типа String в обычную функцию?

    @bromzh
    Drugs-driven development
    Ответ написан
    Комментировать
  • Java. Как перехватить аргумент при вызове метода?

    @bromzh
    Drugs-driven development
    Если у тебя используется JavaEE, то у EJB-бинов можно перехватывать вызов методов через аннотацию, в которой указываешь на класс-перехватчик. Подробнее тут, например.
    Ответ написан
    Комментировать
  • Как отправить правильно отправить POST запрос??

    @bromzh
    Drugs-driven development
    Ты плохо читал доки. Нужен не пост-запрос, а направить пользователя на страницу по определённому адресу. Судя по всему, ты пишешь что-то для андроида. Так вот, как обработать токен на мобильном у них тоже указано.

    А вообще:
    1) Когда шлёшь post, то все данные должны быть в теле запроса, а не в параметрах URL. Смотри в доки внимательнее: гет-запросы там формируются черес УРЛ, для пост-запросов указаны заголовки и другие штуки. Перепутать их сложно.
    2) Формировать URL с параметрами вручную - очень плохо. Для таких целей есть это. Да и вообще, строку нужно формировать через билдер.
    Ответ написан
    1 комментарий
  • Play Framework - Есть ли смысл?

    @bromzh
    Drugs-driven development
    Если новичок, то естественно лучше спринг. Хотя бы потому, что по спрингу намного больше инфы. Ну и влюбом случае, хорошо изучи сперва саму яву.
    Ответ написан
    Комментировать
  • AngularJS или ExtJS для работы с Java бэкендом?

    @bromzh
    Drugs-driven development
    На текущем месте работы делаем личный кабинет интернет-банка. Довольно насыщенный фронтенд - диаграммы, много всяких форм, и т.д.
    Стек как раз Spring + angular с requirejs(я фронтенд пилю). Пишется отлично. На другом фреймворке было бы геморнее.

    UPD. Перечислю вещи, которые мне нравятся в ангуляре.
    • DI. Это довольно хороший паттерн, и тут он очень помогает. Да и это близко по духу к самой яве, там это часто используется.
    • Двустороннее связывание данных. Многие критикуют его, т.к. в больших приложениях могут начаться тормоза из-за кучи вотчеров. Но на самом деле, если писать нормальный код, связывать с 2-х сторон только нужное и помнить про циклы. то всё будет хорошо.
    • Директивы
    • Отсутствие шаблонов. Вместо этого манипуляции напрямую с DOM. Для меня это плюс, так как нет разделения на обычный html-код и синтаксис шаблонизатора. Это очень удобно. Сперва делается вёрстка, при этом верстальщик не обязательно должен знать ангуляр. А потом js-разраб расставляет по коду директивы и постепенно наращивает функционал. В случае наличия шаблонизатора, верстальщик должен ещё и уметь в шаблоны.
    • Отсутствие стандартного набора виджетов. Можно выбирать на свой вкус: есть модуль с UI на Bootstrap'e, есть Matrial, и всегда можно сделать свой набор UI
    • Модули
    • Куча библиотек почти на все случаи жизни
    Ответ написан
    1 комментарий
  • Почему приложения для Android пишут на джаве?

    @bromzh
    Drugs-driven development
    Для андроида пишуь на яве потому что гугл давно полюбил этот язык, и сделал свою мобильную ОС (андроид) именно на этом языке. Под капотом там особое ядро линукса и переработанная виртуальная машина явы, которая и служит прослойкой, между приложухами и ядром. Т.е. почти любое приложение запускается в этой виртуальной машине, соответственно должно быть написано на яве (если точнее, то виртуалка запускает байткод, который получается после компилирования программ). И большинство библиотек именно для явы.
    Можно писать на питоне, но это медленно. Да и библиотек намного меньше.
    На C/C++ тоже можно писать, но там свои заморочки. и гугол рекомендует использовать это лишь в крайних случаях.
    Для остальных языков инфраструктура тоже небольшая. Так что в 95% стоит брать яву, как и задумывалось.

    Ну а на счёт того, что ява ужасна, на ней нет приложений и она скоро сдохнет - это полный бред. Язык простой (хоть и многословный), инфраструктура JVM ещё лучше. есть огромнейшее число библиотек на все случаи жизни. Ну и перспективы у него очень хорошие: андроидофонов сейчас намного больше, чем телефонов на других платформах, энтерпрайз любит и использует яву вовсю ( подавляющее большинство интернет-банков именно на яве), десктопные приложения можно писать на хорошем JavaFX. Т.е. область применения очень широкая. И это реально кроссплатформенный язык, так что запускать свои поделки можно почти везде. Скорость у явы вполне хорошая (например, в бенчмарке сетевых фреймворков, сервера на яве обычно в лидерах), а многословность лечится другими языками (scala, kotlin, groovy).
    Ответ написан
  • Java. Абстракции, интерфейсы, наследования. Как реализовать?

    @bromzh
    Drugs-driven development
    Определять какой класс использовать надо извне. Для этого есть всякие Factory-паттерны. А проверку внутри абстрактного класса надо убрать.
    А статические методы желательно избегать, хотя в простых factory их можно использовать.

    Список надо параметризировать типом Human, а класс параметризировать как . Или просто использовать везде тип Human, как бы полиформизм для того и придуман.

    UPD
    public interface Human {
        public void jump();
        public void say(String text);
    }
    
    
    public abstract class AbstractHuman implements Human {
        protected String name;
    
        public AbstractHuman(String name) {
            this.name = name;
        }
    
        @Override
        public void say(String text) {
            System.out.println(name + ": " + text);
        }
    }
    
    
    public class Man extends AbstractHuman {
        public Man(String name) {
            super(name);
        }
    
        @Override
        public void jump() {
            System.out.println("Man jump");
        }
    }
    
    
    public class Woman extends AbstractHuman {
        public Woman(String name) {
            super(name);
        }
    
        @Override
        public void jump() {
            System.out.println("Woman jump");
        }
    }
    
    
    public interface HumanFactory {
        public static Human createHuman(String name, boolean kadyk) {
            if (kadyk) {
                return new Man(name);
            }
            return new Woman(name);
        }
    }
    
    import java.util.LinkedList;
    import java.util.List;
    
    public class Main  {
        static class DBData {
            String name;
            boolean kadyk;
            public DBData(String name, boolean kadyk) {
                this.name = name;
                this.kadyk = kadyk;
            }
        }
    
        public static void main(String[] args) {
            List<DBData> source = new LinkedList<>();
            source.add(new DBData("Ваня", true));
            source.add(new DBData("Маша", false));
            source.add(new DBData("Катя", true));
            source.add(new DBData("Сергей", true));
            
            List<Human> humanList = new LinkedList<>();
            
            for(DBData data : source) {
                humanList.add(HumanFactory.createHuman(data.name, data.kadyk));
            }
            
            for(Human human : humanList) {
                human.say("Hello");
                human.jump();
            }
        }
    }
    Ответ написан
    Комментировать
  • Как логировать в БД запрос/ответ вебсервиса (в частности jax-ws на tomcat/glassfish)?

    @bromzh
    Drugs-driven development
    Томкат не поддерживает всё из JavaEE, это лишь контейнер сервлетов, а не полноценный ApplicationServer. Так что либо используй TomcatEE, либо другие сервера (я рекомендую WildFly).

    Про запись лога в БД можно почитать тут.
    Ещё можно использовать interceptors (перехватчики). Это часть JavaEE, перехватывать можно методы бинов. Подробнее тут и в гугле.

    В томкате нет БД, там вообще всё по минимуму. Чтобы подключить БД надо самому добавлять jar-файлы с реализацией JPA, самому настраивать базу в приложении. При этом, JTA и другие штуки будет сложно подключить и настроить, потому что томкат не ApplictionServer. Лучше взять WildFly. Там уже есть один DataSource по-умолчанию (БД в оперативной памяти, очищается после перезапуска сервака), и легко подключить новый источник к самому веб-серверу.
    Ответ написан
    1 комментарий
  • Выбор средств для разработки высоконагруженного веб приложения?

    @bromzh
    Drugs-driven development
    Groovy тормоз, судьба Grails неизвестна. Тут уж тогда лучше Scala + какой-то фреймворк. Java и её серверы быстрые, но всякие ORM, EJB и друшие штуки эту скорость поглощают.
    Просто научиться разрабатывать веб на яве достаточно непросто.
    Ответ написан
    Комментировать
  • Как связать Netty c MongoDb?

    @bromzh
    Drugs-driven development
    В третьей версии драйвера для явы появилась асинхронность.
    Ответ написан
    Комментировать
  • Как устроены списки в Java?

    @bromzh
    Drugs-driven development
    В яве несколько списков. Есть интерфейс List, есть несколько его реализаций. Самые популярные - это ArrayList (по-сути - динамический массив), есть LinkedList - связный список. Если ты немножко погуглишь, то найдёшь их исходники, они всё скажут сами за себя.
    В будущем, чтобы реализовать свой список, лучше реализовывай стандартный интерфейс.
    Ответ написан
    Комментировать
  • Как stateful bean сохраняет состояние?

    @bromzh
    Drugs-driven development
    По хттп сессии идёт идентификация клиента.
    В Web-части (servlet, jax-rs, etc) есть всякие ресурсы, которые можно внедрить через аннотации (в случае jax-rs, например) или вытащить напрямую из request (в случае сервлетов). Один из них - это HttpSession. Там хранится id сессии, по которой можно идентефицировать клиента. У EJB слоя есть свой SessionContext, который не связан с HttpSession напрямую (но использует её, чтобы определить вызывающего клиента). Этот SessionContext уже распространяется на всё приложение, и (вроде как) именно нём хранятся состояния stateful-бинов.
    Ответ написан
    Комментировать
  • Как организовать автоматическую запись в JPA?

    @bromzh
    Drugs-driven development
    Если в поле, которое отмечено как отношение, есть данные, то JPA сам должен сохранять связанные сущности, надо только правильно связи указать.
    Ответ написан
  • Java или .NET - выбор с перспективой (не холивар)?

    @bromzh
    Drugs-driven development
    Java перспективнее:
    • Язык развивается, пусть не так быстро, но зато с сохранением обратной совмесимости
    • Язык кроссплатформенный и open source. Да, .net тоже открыли, но пока только частично
    • Уже существует огромное количество разных решений: много серверов, много фреймворков. Все они проверены временем и пашут быстрее шарпов. Под .net решений мало, сервера пока развёртываются только под виндой, фреймворков - единицы
    • Из этих пунктов следует то, что энтерпрайз будет и дальше выбирать java, а не .net
    • Под JVM есть крутые вещи типа Scala, Kotlin, Groovy
    • Android - имеет хорошую перспективу. Сейчас влепить его можно на любой дешёвый китайский ширпотреп, что не скажешь о виндофоне.
    • Для десктопа есть классная JavaFX, которая ещё и запускается везде. Решения для .net только сейчас начинают становиться по истине кроссплатформенными.
    Ответ написан
    Комментировать
  • Какой использовать алгоритм сортировки, если требуется сложность не более O(n) и максимальная производительность?

    @bromzh
    Drugs-driven development
    Во-первых, есть строгое доказательство, что сортировка произвольного массива не может быть выполнена быстрее, чем за O(n*log(n)) операций (log тут по основанию 2).
    Во-вторых, у сортировок есть много параметров: время в лучшем/худшем/среднем случае, доп. память, стабильность.
    QuickSort имеет время O(n log n) в среднем и лучшем, а в худшем - за O(n^2). Ещё она нестабильная и требует O(n) памяти. В обычных условиях это устраивает, но худший случай в ней - её слабое место.
    Есть модификации быстрой сортировки, позволяющие уменьшить время худшего случая до O(n log n).
    В языках программирования встроенные сортировки - это обычно либо быстрая сортировка с улучшениями, либо какая-нибудь стабильная сортировка, какой-нибудь merge sort.

    Так что либо бери родную, либо пиши сам. Самая простая модификация быстрой сортировки, при которой худшее время станет O(n log n) - это сделать случайный выбор опорного элемента.

    Ну и читай https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D...
    Ответ написан
    3 комментария
  • Какими преимуществами обладает Go по сравнению с Java?

    @bromzh
    Drugs-driven development
    Есть ещё Scala + Akka - акторы, Vert.x - event-driven non-blocking фреймворк для JVM, поддерживает несколько языков.
    Ответ написан