Контакты
Местоположение
Россия, Татарстан, Казань

Достижения

Все достижения (1)

Наибольший вклад в теги

Все теги (7)

Лучшие ответы пользователя

Все ответы (12)
  • Почему "" != "" ??

    @distrik
    Programador
    Оператор == в случае с объектами сравнивает ссылки. При создании строк с одинаковым значением нет гарантии, что это окажется один и тот же объект, а значит они могут иметь разные ссылки.
    Для сравнения объектов принято испольховать оператор equals.
    Так же, строки можно сравнить через ==, если сравнивать не сами объекты, а результаты их интернирования:
    str1.intern() == str2.intern()
    И все же, имхо, лучше использовать equals()
    Ответ написан
    Комментировать
  • Как происходит остановка 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 комментарий
  • Как правильно использовать dto в данной ситуации?

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

    @distrik
    Programador
    Специалист во всем - специалист ни в чем. Распыляться имеет смысл, только если это не тормозит развитие основного навыка.
    Один очень хороший программист как-то посоветовал мне постараться хотя бы раз в год знакомиться с новым языком программирования, потому каждый язык создавался неся в себе какую-то идею, которую он так или иначе реализовал. Это поможет расширить кругозор в отношении существующих в программировании проблем.
    Но если вы только начали знакомиться с java, то лучше хорошенько углубиться в нее для начала. Там есть куда копать в глубь.
    Ответ написан
    Комментировать
  • Не удаётся преобразовать 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;
    }
    Ответ написан
    Комментировать

Лучшие вопросы пользователя

Все вопросы (1)