Ответы пользователя по тегу Java
  • Что делать, если при попытке создать переменную в Java выводит ошибку?

    @Akela_wolf
    Extreme Programmer
    Это не ошибка, а предупреждение.

    Ошибки IDE как правило подчеркивает красным, предупреждения - желтым (по крайней мере в IDEA это так, скриншот похож на IDEA, но я не уверен).

    Собственно текст предупреждения и говорит о том что переменная нигде не используется.

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

    Предупреждение исчезнет когда вы допишете фрагмент.
    Ответ написан
    1 комментарий
  • Что писать в резюме чтобы были шансы куда-то попасть без опыта?

    @Akela_wolf
    Extreme Programmer
    Я не рекрутер, но попробую дать совет.

    Попробуй фриланс. Заказчикам на фрилансе обычно пофигу на резюме.

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

    Альтернативный вариант - участвуй в open source проекте. И тогда тоже сможешь написать соответствующую строчку в резюме, в разделе "опыт работы". Появится строчка - появятся шансы проскочить через HR и добраться до технических вопросов на собеседовании.
    Ответ написан
  • Разница в стримах коллекций и массива?

    @Akela_wolf
    Extreme Programmer
    Потому что в Java массивы и коллекции - это совершенно разные вещи (хоть и похожие по своему назначению). Массив, находится максимально близко к сишному массиву (разве что на джаве встроена проверка выхода за пределы, а в остальном - практически также). Соответственно, массив не может иметь своих методов, т.к. не является объектом (аналогично примитивным типам данных, по сути массив - это примитивный тип данных в Java). Коллекция же, наоборот, суть объект. Что и обуславливает разницу между ними. Эту разницу можно было бы сгладить на уровне языка, но во времена разработки Java не было понимания как удобнее сделать. А затем - бремя обратной совместимости пришлось нести через годы (аналогичная история приключилась с type erasure). Причем это настолько фундаментальная разница, существующая на уровне JVM, поэтому даже современные языки, например Kotlin, не в состоянии уйти от этой нее (так в Kotlin, класс Array не реализует интерфейс Iterable именно по этой причине).
    Ответ написан
    Комментировать
  • Как сформировать и отправить Principal на React Js в Spring Boot приложение?

    @Akela_wolf
    Extreme Programmer
    React-приложение должно послать те данные, которые нужны спрингу, чтобы сконструировать Principal. Распространенный вариант - JWT-токен. Либо идентификатор сессии. Либо еще что-то, нужно смотреть конкретику как у вас сконфигурирован Spring Security в приложении.
    Ответ написан
    Комментировать
  • Есть ли жизнь на Java (Бекенд) кроме Финтеха?

    @Akela_wolf
    Extreme Programmer
    Есть. Скажу лично про себя - работаю в сфере логистики, у нас в рантайме Java 11, а пишем мы на Kotlin. Стек вполне современный (некоторое количество легаси есть, но не слишком много).

    Еще точно знаю что СДЭК ищет Java-разработчиков, но больше про них ничего сказать не могу.
    Ответ написан
    Комментировать
  • Найти работу java без опыта и образовния - невозможно?

    @Akela_wolf
    Extreme Programmer
    Возможно, хотя и сложно.
    Требуется:
    1. иметь знания и навыки. Причем по современному, востребованному стеку. В случае Java это: Spring Boot, Hibernate, SQL, Kotlin, Gradle... Можете пойти в сторону мобильной разработки (под Android), там своя специфика. В той стороне сейчас модно Kotlin Multiplatform (потом с ним вернетесь к бэку, если будет интересно). Уметь Git - для командной работы это очень важный инструмент. Английский на уровне чтения и понимания документации и технических статей.
    2. иметь практический пример использования ваших знаний и навыков. Это могут быть: ответы на stackoverflow (заодно уровень английского прокачаете), pet projects, мерж реквесты в open source библиотеки/проекты. Фрилансерские проекты и т.п. В общем хоть что-то что показывает как вы пользуетесь вашими знаниями на практике. Чем больше таких примеров, тем лучше.
    3. пробиться на уровень технического собеседования. Это может оказаться сложно, поскольку HR будет смотреть на формальную сторону вашего резюме. Так что ищите компании, в которых есть вакансия junior developer. Такие компании, обычно, готовы обучать новых разработчиков, поэтому к ним будет проще
    4. если пройдете онлайн-курс и получите сертификат - это тоже будет вам плюсом.
    Ответ написан
    Комментировать
  • Правильно ли я понял принцип инверсии зависимостей?

    @Akela_wolf
    Extreme Programmer
    Главная идея принципа инверсии зависимостей "детали зависят от абстракций, но не абстракции от деталей".
    В приведенном вами примере класс Main зависит от всего: от интерфейса INumberOperation и от обоих классов NumberOperation1, NumberOperation2. То есть тут принцип инверсии зависимостей вообще не работает. Никак.

    Проявляется же он в следующем примере. Пусть у меня есть некая абстрактная логика "прочитай число, выполни над ним операцию, запиши результат". Эта абстрактная логика (потому она и абстрактная) ничего не должна знать ни откуда она читает число, ни какую операцию над ним выполняет, ни куда и как записывает результат. Таким образом, у нас есть модуль, состоящий из
    interface NumberInput {
      int read();
    }
    interface NumberProcessor {
      int process(int a);
    }
    interface NumberOutput {
      void write(int a);
    }
    class Processor {
      private final NumberInput input;  
      private final NumberProcessor processor;
      private final NumberOutput output;
    
      public Processor(NumberInput input, NumberProcessor processor, NumberOutput output) {
        this.input = input;
        this.processor = processor;
        this.output = output;
      }
    
      void process() {
        output.write(processor.process(input.read()));
      }
    }

    Все. Модуль получился очень абстрактным и ни от кого никак не зависящим.
    Затем мы можем сделать реализации этих интерфейсов - они будут зависеть от нашего модуля логики (так как ссылаются на интерфейсы). И это полностью соответствует принципу инверсии зависимостей - детали зависят от абстракций.

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

    Этот принцип очень хорошо объяснен в книге Р.Мартина "Чистая архитектура", по крайней мере у меня все встало на свои места именно после прочтения этой книги.
    Ответ написан
    1 комментарий
  • Как сохраненить сессии между rest-запросами в spring boot?

    @Akela_wolf
    Extreme Programmer
    Сессии работают следующим образом: при создании сессии сервер отсылает заголовок Set-Cookie браузеру в котором сохраняет значение идентификатора сессии (JSESSIONID). При последующих запросах браузер посылает "печеньку" обратно серверу и тот, получив идентификатор, может восстановить сессию из своего хранилища. Если "печеньки" заблокированы, то возможно передать jsessionid как query param запроса. Но это уже требует дополнительных телодвижений на стороне клиента.

    Так как вы упоминаете REST, то предположу использование XmlHttpRequest в браузере (напрямую или опосредованно через какую-то библиотеку), который не посылает заголовок Cookie по умолчанию.

    Поэтому вариантом решения может быть отправка идентификатора сессии явным образом как query param с именем jsessionid.

    Однако, использование сессии в REST запросах - в целом не очень хорошая практика, так как REST предполагается быть stateless. А в случае сессии у вас появляется состояние на стороне сервера. Если сессия нужна только для аутентификации клиента, то посмотрите на использование токенов, таких как JWT, которые позволяют решить эту проблему без наличия сессии на стороне сервера.
    Ответ написан
    Комментировать
  • Меняют ли аннотации данные в коде?

    @Akela_wolf
    Extreme Programmer
    Давайте по порядку.

    Что такое аннотация? Аннотация - это некоторые произвольные метаданные, которые программист может присоединить к некоторому объекту. И только. Данные, ничего кроме. Никакого поведения сама по себе аннотация не добавляет.

    То есть аннотация ничего не делает? Да, именно так. Сама по себе аннотация ничего не делает.

    Тогда зачем она вообще нужна? Для того чтобы аннотация оказала какое-то влияние на программу нужен процессор аннотаций. Процессор аннотаций бывает двух видов: первый работает во время компиляции программы. И аннотации оказывают влияние именно на процесс компиляции. Это может повлиять на итоговой код программы, либо изменить логику работы компилятора, например, добавить какие-то дополнительные проверки.

    Второй вид процессоров аннотаций работает во время выполнения программы. Через механизм рефлексии он анализирует аннотации, которые добавил программист, и выполняет логику в соответствии с аннотации и содержащимися в них даннми. Так, например, работает Spring, который в соответствии с аннотациями @Service, @Scope, @Autowired, @Controller и т.п. инициализирует компоненты приложения и запускает его в нужной конфигурации.

    У Эккеля написано неточно (либо это неточный перевод, такое тоже часто бывает). Переменные никакого значения не получают, получает значение поле в аннотации (аннотация в Java - это тоже объект и тоже имеет поля). А затем уже процессор аннотаций значение этого поля как-то использует (в приведенном примере - устанавливает соответствие с колонкой в таблице базы данных соответствующего типа и, при необходимости, создает её).

    У Шилдта написано корректнее - сами по себе аннотации никак семантику программы не затрагивают, для того чтобы они заработали требуется дополнительный код.
    Ответ написан
    1 комментарий
  • Java. Не могу запустить программу через командную строку. Что делать?

    @Akela_wolf
    Extreme Programmer
    Потому что вы пытаетесь запустить файл homework.lesson8.HelloWorld находясь в каталоге с файлом. java логично пытается найти файл ./homework/lesson8/HelloWorld.class и обламывается о чем вам и сообщает.

    java HelloWorld тоже не работает т.к. java находит файл HelloWorld.class внутри которого написано что он принадлежит пакету homework.lesson8, то есть это не тот файл который хочет запустить пользователь.

    Сделайте cd ../.. (перейдите в каталог src) и запускайте java homework.lesson8.HelloWorld - будет работать

    Но вообще перемешивать исходный код (*.java) и скомпилированные файлы (*.class) в одних и тех же директориях - очень плохая идея. Обратите внимание, что IDEA, когда компилирует файлы складывает их в папку out. Можете перейти туда и запускать свою программу из той папки (тогда вызывать javac отдельно вам не нужно). Либо указать в опциях javac куда нужно складывать скомпилированные файлы.
    Ответ написан
    2 комментария
  • Как при помощи JpaRepository выполнить строку?

    @Akela_wolf
    Extreme Programmer
    То что вы пытаетесь сделать называется - SQL-injection. Почитайте для интереса сколько сайтов было взломано только потому что возможно было подставить какую-то строку в SQL-запрос и таким образом повлиять на его результат.

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

    @Akela_wolf
    Extreme Programmer
    Зачем вы извращаетесь со строкой alfa?
    Откройте для себя метод String.getBytes() и вообще разберитесь что такое кодировка символов.
    Ответ написан
    Комментировать
  • Thymeleaf, th:text не работает, если находится внутри другого th:text, как обойти?

    @Akela_wolf
    Extreme Programmer
    Наверное так? Иначе подстановка содержимого в тег h4 затрет тот шаблон, который вы в нем написали.
    <h4><span th:text="${product.name}">Some product</span><span th:text="${product.getPrice()}">45</span></h4>
    Ответ написан
    1 комментарий
  • Как суммировать вывод двух потоков?

    @Akela_wolf
    Extreme Programmer
    Так как написано у вас - никак. Потоки сами вызывают println, то есть выводят на экран. И ничего вы с этим не сделаете. Нужно сделать так, чтобы потоки обменивались данными с другим (главным) потоком, который уже будет выполнять обработку данных и выводить на экран. Например через очереди.
    import java.util.Queue;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
     
    public class Main {
     
        static class Task extends Thread {
     
            private final Queue<Integer> queue;
     
            public Task(Queue<Integer> queue) {
                this.queue = queue;
            }
     
            @Override
            public void run() {
                for (int i=0; i<=10; ++i) {
                    queue.add(i);
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
     
        public static void main(String[] args) throws InterruptedException {
            final BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(100);
            final BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(100);
     
            final Thread thread1 = new Task(queue1);
            thread1.start();
            final Thread thread2 = new Task(queue2);
            thread2.start();
     
            while(true) {
                System.out.println(queue1.take() + queue2.take());
            }
     
        }
    }
    Ответ написан
  • Зачем в интерфейсах логика?

    @Akela_wolf
    Extreme Programmer
    1. Класс может иметь поля (состояние), интерфейс нет. Вот это первое и главное различие
    2. Интерфейс не может иметь протектед и приватные методы, класс - может.

    А вообще в интерфейсы можно писать методы с реализацией, чтобы прямо в интерфейсе задокументировать что "вот этот метод он как бы не самостоятельный метод, он реализуется поверх других методов интерфейса. Но он часто используется, он удобный, поэтому вот - держите прямо в интерфейсе". Ну и при необходимости в классе можно перекрыть этот метод, например, чтобы предоставить оптимизированную версию.

    Еще посмотрите extension functions в Котлине - придуманы с той же идеей, хотя имеют свои преимущества (легко добавить к существующему интерфейсу/классу) и недостатки (нельзя перекрыть в производном классе)
    Ответ написан
    Комментировать
  • JDBC, почему нельзя использовать один Connection для нескольких методов в разрезе многопоточности?

    @Akela_wolf
    Extreme Programmer
    1. Синхронизация между потоками. Если оба потока начнут посылать запросы в БД через один коннекшен - могут начаться спецэффекты (тут нужно курить "потокобезопасность" коннекшена)
    2. Транзакции в БД. Запросы через один коннекшен будут в одной транзакции. Если для вас это ОК - то все ок. Если же разные потоки требуют разных транзакций - то придется каждому потоку выдавать свой коннекшен.
    100 пользователей и 100 потоков - это слегка разные вещи. Я бы в первую очередь посмотрел сюда - по потоку на каждого пользователя для меня выглядит подозрительно. Если это веб, то у вас от каждого пользователя приходит запрос, обрабатывается, отправляется ответ. Все. Если от пользователей приходит мало запросов - это может делать и один поток. И даже в случае вебсокетов - все равно не нужно держать по потоку на пользователя.
    Ответ написан
    Комментировать
  • Архитектура. Насколько правильно хранить в Entity данные, не относящиеся к БД?

    @Akela_wolf
    Extreme Programmer
    В принципе можно, никто вас за такое не расстреляет. Проблемы - тут все зависит от масштаба вашего приложения и требований к дальнейшей поддержке и изменениям в коде. Чего-то прямо серьезного, что вылезет всегда или почти всегда я в этой истории не наблюдаю.
    Ответ написан
    Комментировать