LINUX.ORG.RU

Java факап

 , ,


0

1

Что вернёт метод и почему?

public int x() {
  boolean isFalse = false;
  Integer i1 = 1;
  String str = "x";
  if (str.equals("e") && 
      !isFalse ? true : i1.equals(1)) {
    return 1;
  }
  return 0;
}
//openjdk version "1.8.0_222"

★★★★★

Последнее исправление: crutch_master (всего исправлений: 3)
Ответ на: комментарий от ya-betmen

Меня налюбило форматирование и вера в то, что прошлый кодер не мог так накосячить, ведь оно как-то работает 2 года. Обычно я не тащу тернарники в какие-то выражения и делаю такое где-то отдельно, а не в условиях.

crutch_master ★★★★★
() автор топика

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

anonymous
()
Ответ на: комментарий от anonymous

Да это не мои мопеды:)
С флоатами история не закончилась. Либа начала падать на десятке и решили откатиться. Автор дал последнюю версию либы, надо пересобирать проект на дельфи 10.

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от mimico

С тех пор как от перемены мест слагаемых меняется результат, подробности тут - wat. В С++ через operator тоже можно такое сделать(гибкость во всем теле, все дела), но это надо знатно упороться. В JS-е такой бред из коробки :-)

Pinkbyte ★★★★★
()
Ответ на: комментарий от ya-betmen

Чоэта? Код условно рабочий, нареканий не вызывал, что на него думать плохо.

crutch_master ★★★★★
() автор топика

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

ilovewindows ★★★★★
()
Ответ на: комментарий от crutch_master

Если писать и читать такое каждый день, приоритеты будут очевидны, даже некая красота в уродстве. А постороннему человеку подляна. Скобок туда насыпать надо.

ilovewindows ★★★★★
()
Ответ на: комментарий от ilovewindows

Если писать и читать такое каждый день

Там не такое, там еще портяночка из get'ов.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от crutch_master

Напечатай себе java operator hit parade.

У тернарного один из самых низких приоритетов (если не самый низкий).

Bass ★★★★★
()
str.equals("e") && 
      !isFalse ? true : i1.equals(1)

Обфускация кода форматированием

anonymous
()
Ответ на: комментарий от anonymous

офигеть как легко парсится

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

вместо простого тернарника, которому надо только скобок поставить в условии

Пожалуйста, перечитай мои сообщения. Дело не в скобках, а в их необязательности. Больше скажу, если бы скобки были бы обязательными, то и проблемы бы не было.

Siborgium ★★★★★
()

Мыши плакали, кололись, но продолжали использовать языки, в которых надо учить портянки с приоритетами операторов.

Nervous ★★★★★
()
Ответ на: комментарий от crutch_master

Eclipse сам по себе не панацея.

К нему есть масса модулей для статического анализа кода (pmd, checkstyle) и поиска проблем уже на уровне байткода (findbugs).

По-хорошему, на сервере CI модуль checkstyle должен быть частью процесса сборки (оно всё интегрируется с Maven и Gradle), и проект не должен собираться при превышении порога WTF на строчку кода.

Помимо этого, если в проекте больше одного человека, должен быть налажен процесс code review.

Помимо этого, код должен быть «покрыт» тестами. Можно пойти дальше и внедрить мутационное и/или рандомизированное тестирование.

А заявлять, что «язык X плох, потому что позволяет мне наступить себе на яйца» или «мои подчинённые написали говнокод», — непрофессионально. Просто у вас в проекте не удосужились организовать процесс разработки.

P.S. Ну и, наконец, WTF просто неинтересный. Это как смеяться над трёхлетним ребёнком, что он пишет с ошибками. Интересно — это когда баг в компиляторе, или ошибка в native-коде, или нарушение Java Memory Model. А твой случай разобран ещё в учебниках 1996 года.

Bass ★★★★★
()
Последнее исправление: Bass (всего исправлений: 2)
Ответ на: комментарий от Nervous

Не знаю, за меня скобки редактор считает.

«Отличный» язык для которого еще нужен редактор, чтоб считал скобки.

anonymous
()
Ответ на: комментарий от Siborgium

Согласен. Но непонятно, где их требовать. Вокруг условия и вокруг всего оператора? А если нуб пишет “if (a || (x && (y-1) ? …))”, то что он ожидает? Как разлинтить его непонимание?

Существует также ?(cond, expr, expr) нотация, больше похожая на то, о чем речь. Я ее где-то видел помимо 1с, но не помню где. Возможно в бейсике каком-то древнем.

anonymous
()

Эмм, а в чем факап-то? В том, что ТС по жизни не осилил ничего окромя джанги и жс? Так это мы и так знали.

тред не читал

anonymous
()
Ответ на: комментарий от Nervous

Вкалывают роботы, счастлив человек.

Роботы не могут в «портянки с приоритетами операторов»?

anonymous
()
Ответ на: комментарий от Bass

А заявлять, что «язык X плох, потому что позволяет мне наступить себе на яйца» или «мои подчинённые написали говнокод», — непрофессионально

Ну это не ко мне вопрос, я не говорю, что ява - говно по-этому, а тот кодер не был моим подчинённым. Просто пригорел:)

P.S. Ну и, наконец, WTF просто неинтересный.

Да ладно, все тут собрались, пообщались, такой-то повод.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от anonymous

В том, что ТС по жизни не осилил ничего окромя джанги и жс?

Что такое джанга?

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от crutch_master

Ты бы лучше что-то из Баруха Садогурского сюда притащил. Вот, например, хотя бы https://habr.com/ru/company/jugru/blog/352438, например.

Или, вот, например, данная лямбда – это Runnable или Callable?

() -> {
    throw new Exception();
}
Bass ★★★★★
()
Ответ на: комментарий от Siborgium

а str.equals("e") нахер идет? Он разве не должен выполниться первым и получив false забить на !isFalse ? true : i1.equals(1)? Что не так с Java?

SR_team ★★★★★
()
Ответ на: комментарий от SR_team

Не должен. У тернарного оператора приоритет ниже, поэтому str.equals("e") && !isFalse будет воспринято как одно выражение.

Siborgium ★★★★★
()

Скобки – лучший друг программиста в C-like. Не каждый вспомнит лестницу приоритетов битовых/арифметических/логических операций.

Некоторые даже отрицательные числа скобками оборачивают, якобы для наглядности. Но мы-то с вами знаем…

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от Bass

Или, вот, например, данная лямбда – это Runnable или Callable? ''' () -> { throw new Exception(); } '''

точно не Runnable, т.к. требует явной декларации исключения, а тип замыкания или указывается явно, или вычисляется из контекста, в том числе и контекста присваивания.

А лямбдой это можно называть только во вольных фантазиях явистов, это блямбда.

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

anonymous
()
Ответ на: комментарий от SR_team

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

Princesska ★★★★
()
Ответ на: комментарий от Princesska

жабоскрипт уходит покурить.

Кстати в плюсах так же

#include <iostream>
#include <string>

int main(){
    bool isFalse = false;
    int i1 = 1;
    std::string str = "x";
    if (str == "e" && !isFalse ? true : i1 == 1)
        std::cout << "1" << std::endl;
    else std::cout << "0" << std::endl;
    return 0;
}
SR_team ★★★★★
()
Ответ на: комментарий от EXL

Некоторые на -1 * умножают, из-за дебильных шрифтов, в которых минус короче, чем гулькин пинус. В моноширинном шрифте место сэкономили, гении.

anonymous
()
Ответ на: комментарий от anonymous

точно не Runnable, т.к. требует явной декларации исключения

Да, ты прав. Но, если заменить на RuntimeException, то всё равно будет не проще, т. к. интерпретация будет зависеть от контекста.

Bass ★★★★★
()
Ответ на: комментарий от Bass

Или, вот, например, данная лямбда – это Runnable или Callable?

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

O02eg ★★★★★
()
Последнее исправление: O02eg (всего исправлений: 1)
Ответ на: комментарий от Siborgium

Это какой-то java прикол? Как оно вообще работает?

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Компилятор не должен пропускать такой код.

Но компилятор раста пропустил такой код: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ba1ce7e7c3544671d486bc00484fc506 (поскольку в расте тернарный оператор и if одно и тоже, то в версии раста будет просто два if)

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 2)

PHP круче, надолго запомнил одну граблю:

// Константа false присваивается $f, а затем значение true игнорируется
// Действует как: (($f = false) or true)
$f = false or true;

долго пытался понять почему простейший код не работал.

No ★★
()
Ответ на: комментарий от WitcherGeralt

Приоритеты не при чём, тут просто условие мудак написал, вот и всё

Ну и это тоже, согласен.

Nervous ★★★★★
()
Ответ на: комментарий от anonymous

Зато можно писать or die.

Прямо как в Перле.

Nervous ★★★★★
()
Ответ на: комментарий от EXL

но мы то с вами знаем что это Haskell, видимо ты это хотел сказать.

anonymous
()
Ответ на: комментарий от O02eg

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

Всё верно. Но ты можешь скормить это выражение «как есть» перегруженному методу, например, ExecutorService#submit() – и вот здесь компилятор как раз самостоятельно решит, это таки Runnable или таки Callable.

Bass ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.