• Какой язык полезно будет учить в сочетании с Java?

    @distrik
    Programador
    Специалист во всем - специалист ни в чем. Распыляться имеет смысл, только если это не тормозит развитие основного навыка.
    Один очень хороший программист как-то посоветовал мне постараться хотя бы раз в год знакомиться с новым языком программирования, потому каждый язык создавался неся в себе какую-то идею, которую он так или иначе реализовал. Это поможет расширить кругозор в отношении существующих в программировании проблем.
    Но если вы только начали знакомиться с java, то лучше хорошенько углубиться в нее для начала. Там есть куда копать в глубь.
    Ответ написан
    Комментировать
  • Что должен знать backend разработчик на java?

    @distrik
    Programador
    Кор на достойном уровне, спринг и javaEE хотя бы в общих чертах, иметь представление о JMS или аналогах, об SQL и noSQL, иметь представление о протоколах и уровнях OSI, уметь работать с многопоточкой и знать соответствующие фреймфорки.
    Вообще, вопрос очень неточный. Нет какого-то конечного набора знаний, все зависит от специфики, и от уровня, на который вы ориентируетесь.
    Ответ написан
    Комментировать
  • Не удаётся преобразовать double [] к классу Main как решить?

    @distrik
    Programador
    Первая часть кода
    private double [] vektor;
    public Main() {
    double [] vektor = {2, 3.5, -5};
    }

    не имеет никакой связи со второй частью
    public Main plus (Main vektor){
    double [] a = {2, 3.5, -5};
    double [] b = {2, 3.5, -5};
    double [] r = new double [a.length+b.length];
    System.arraycopy(a, 0, r, 0, a.length);
    System.arraycopy(b, 0, r, a.length, b.length);
    return r;
    }

    Мало того, при объявлении метода:
    public Main plus (Main vektor)

    вы сказали, что вам для работы понабится параметр типа Main, но в теле нигде не использовали его.
    А еще, вы пооьещали вернуть объект типа Main, в возвращаете массив.
    Либо пообещайте честно возвращать массив
    public double[] plus (Main vektor)

    Либо положите массив внутрь Main через конструктор
    public Main(double [] vektor) {
    this.vektor = vektor;
    }
    Ответ написан
    Комментировать
  • Как правильно использовать dto в данной ситуации?

    @distrik
    Programador
    Подход вполне хороший. Он хорош тем, что твоему коллеге не придется гадать, в какой ситуации какие поля заполнять. Но всего хорошо в меру. Если у тебя подобных кейсов очень много, то описывать под каждый отдельный ДТО может оказаться слишком затратно, и к тому же, коллега запутается в их огромном количестве.
    Ответ написан
    Комментировать
  • Как компилировать java-файл без javac?

    @distrik
    Programador
    Тщательно изучаешь спецификацию java и байткода. Садишься и начинаешь переписывать.
    Ответ написан
    Комментировать
  • Что мне делать если я хочу стать разработчиком игр но не чего по этому не знаю?

    @distrik
    Programador
    Самый компромисный вариант для ничего не знающего, но горящего желанием - это писать плагины под Minecraft. В интернете достаточно статей для полных чайников.
    Если есть запас терпения, то можно пойти по игровым ресурсам типа codebattle, codegames и тп.
    Есть ресурсы для людей, которым очень тяжело дается программирование, например, javaRush (там же есть возможность написать простую игру на выбор за достаточно короткое время).
    Ответ написан
    3 комментария
  • Как можно оптимизировать данную программу?

    @distrik
    Programador
    Может быть так будет быстрее?
    LinkedList<Integer> sweets = new LinkedList<>();
        StringBuilder sb = new StringBuilder();
        AtomicBoolean hasMinAmount = new AtomicBoolean(false);
        sweets.stream()
                .collect(Collectors.toMap(Integer::intValue, integer -> 1, Math::addExact))
                .forEach((candyName, amount) -> {
                  if (amount >= min) {
                    hasMinAmount.set(true);
                  }
                  for (int i = 0; i < amount; i++) {
                    sb.append(candyName + " ");
                  }
                });
        if (hasMinAmount.get()) {
          System.out.print(sb);
        } else {
          System.out.println("Oh sh*t");
        }
    Ответ написан
  • Почему "" != "" ??

    @distrik
    Programador
    Оператор == в случае с объектами сравнивает ссылки. При создании строк с одинаковым значением нет гарантии, что это окажется один и тот же объект, а значит они могут иметь разные ссылки.
    Для сравнения объектов принято испольховать оператор equals.
    Так же, строки можно сравнить через ==, если сравнивать не сами объекты, а результаты их интернирования:
    str1.intern() == str2.intern()
    И все же, имхо, лучше использовать equals()
    Ответ написан
    Комментировать
  • Как собрать апк после Show Java?

    @distrik
    Programador
    Может быть ткну пальцем в небо, но можно попробовать скомпилировать этот отдельно взятый файл и подменить предыдущую скомпилированную версию в jar'нике
    Ответ написан
    Комментировать
  • Лаконичность и правильность кода в Java. В какой момент стоит объявлять переменные в коде?

    @distrik
    Programador
    Как написали ранее, сканером стоит пользоваться одним, и его стоит закрывать

    public static void main(String[] args) {
        try(Requester requester = new Requester()) {
          String name = requester.requestLine("Введите ваше имя");
          String surName = requester.requestLine("Введите вашу фамилию");
          System.out.println(String.format("Здравствуйте, %s %s!", name, surName));
    
          String dish = requester.requestLine("Ваше любимое блюдо?");
          System.out.println(String.format("О, %s! Мне это тоже нравится!", dish));
        }
      }
    
      private static class Requester implements AutoCloseable {
        private final Scanner scanner;
    
        private Requester() {
          this.scanner = new Scanner(System.in);
        }
    
        private String requestLine(String requestMessage) {
          System.out.println(requestMessage);
          return scanner.nextLine();
        }
    
        @Override
        public void close() {
          scanner.close();
        }
      }
    Ответ написан
  • Как написать generic фабрику?

    @distrik
    Programador
    На вскидку не придумал, как избавиться от @SuppressWarnings("unchecked"), может только пойти другим путем.

    public class Main {
      @SuppressWarnings("unchecked")
      public static void main(String[] args) {
        Map<Class<? extends Car>, Handler> carHandlers = new HashMap<>();
        carHandlers.put(Car.class, new CarHandler());
        carHandlers.put(Ford.class, new FordHandler());
        Car car = new Car();
        Car ford = new Ford();
        Object carTest = carHandlers.get(car.getClass()).handle(car);
        Object fordTest = carHandlers.get(ford.getClass()).handle(ford);
        System.out.println(carTest);
        System.out.println(fordTest);
      }
    
      interface Handler<T extends Car> {
        Object handle(T obj);
      }
    
      static class Car {
        String test() {
          return "I'm Car";
        }
      }
    
      static class Ford extends Car {
        String test() {
          return "I'm Ford";
        }
      }
    
      static class CarHandler implements Handler<Car> {
        @Override
        public Object handle(Car car) {
          return car.test();
        }
      }
    
      static class FordHandler implements Handler<Ford> {
        @Override
        public Object handle(Ford ford) {
          return ford.test();
        }
      }
    }
    Ответ написан
  • Как происходит остановка java приложения?

    @distrik
    Programador
    Один из классических способов обработки остановки java-приложения, как сказали выше - Runtime.getRuntime().addShutdownHook. В свою очередь в нем можно подать команду на остановку всем остальным потокам, либо используя флаг "interrupt" класса Thread, либо используя в рабочих потоках предусмотрительно заведенный собственный флаг остановки.

    Соответственно, останавливаемые потоки должны либо периодически проверять флаг остановки, либо корректно обрабатывать InterruptedException.

    Пример с флагом "interrupt"

    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
          Thread.getAllStackTraces().keySet().stream()
              //Не стоит останавливать поток в котором отрабатывает хук, а тем более пытаться заджойниться
              .filter(thread -> !thread.equals(Thread.currentThread()))
              //Демоны предполагают безопасное завершение в любой момент, останавливать их не нужно
              .filter(thread -> !thread.isDaemon())
              //Устанавливаем флаг "interrupt" для всех остальных 
              .peek(Thread::interrupt) 
              .peek(thread -> System.out.println(thread.getClass()))
              .forEach(thread -> {
                try {
                  thread.join(); //Ждем завершения всех потоков, которым установлен флаг "interrupt"
                } catch (InterruptedException e) {
                  // ...
                }
              });
        }));
        
        while (true) {
          try {
            Thread.sleep(100);
          } catch (InterruptedException e) {
            System.out.println("Thread was interrupted once");
            //После перехвата исключения флаг "interrupt" возвращается в исходное состояние, поэтому его нужно установить снова
            Thread.currentThread().interrupt(); 
            break;
          }
        }
    
        while (true) {
          try {
            Thread.sleep(100); // Мы бы зависли здесь, если бы не установили флаг "interrupt" повторно
          } catch (InterruptedException e) {
            System.out.println("Thread was interrupted");
            Thread.currentThread().interrupt();
            break;
          }
        }
        
        while (!Thread.currentThread().isInterrupted()) {
          doSomeUninterruptableWork();
        }
      }
    Ответ написан
    1 комментарий