Это копия, сохраненная 4 июля 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Q: Поздно ли вкатываться в айти в 20/30/40/100 лет?
А: Нет, не поздно.
Q: Cобираюсь учить джаву по 2/5/20 часов в день. За сколько дней я выучу достаточно, чтобы зарабатывать фрилансом?
A: На джаве фриланса нет. Хочешь фрилансить — дуй в ПХП/раби/1С тред.
Q: Хули все книги на английском?
A: Без английского ты не нужен и можешь смело идти нахуй. Ну или в 1С-тред.
Q: Что скажете за джавараш?
Если вкатываешься с нуля, то можешь написать пару "хеллоу ворлдов" до 10 лвла. Дальше курс рассчитан на ленивых и не умеющих читать книжки людей. Количество говнокода зашкаливает, годных задачек пару штук на весь курс. В любом случае решать тебе.
https://github.com/qqqlll/Java-Thread/wiki
Потому что он только на словах АХУЕННЫЙ кодер.
Помню как-то показали код сатаниста, так он проебался в двух строках, не поставив точки с запятыми.
я написал код который поднимает сервер с потоками. Как я могу обезопасить свой комп, когда на пару часиков буду включать серв?
Если у тебя тп-линк, то напике показан пример. Если другой роутер, погугли "как открыть порт в настройках роутера"
а зачем ко мне заходить? Я просто для интереса тут спрашиваю про настройку безопасности сервера
Ну, если у тебя только один порт проброшен наружу, то что тут ещё можно обезопасить?
я просто заядлый параноик. В дальнейшем хочу сделать для себя небольшой постоянный сервер, для данных и прочего. Где я могу почитать про его безопасность и прочее? (буду писать на джаве)
В гугле, видимо.
Нет особой разницы - на джаве, не на джаве.
Лишние порты должны быть закрыты и т.п.
Это если выставляешь весь сервер наружу.
Если же изнутри, и проброшен 1 порт (http) - то и хорошо.
Используй SSL.
Сделай порт с нестандартным номером >1024.
Остальное зависит от сервера и его уязвимостей, если они есть.
А также от уязвимостей в твоём коде.
Если у тебя index.jsp с параметром zalupa=true форматирует диск, например, то это не очень хорошо.
И логи пиши. А потом - читай.
В том числе автоматически, с поиском подозрительных строк.
Система аутентификации должна банить клиента после N неудачных попыток.
И т.д. и т.п.
Если хочешь как у взрослых - гугли как сделать сервер в DMZ.
Хотя, не представляю, зачем.
спасибо!
А у меня другая проблема: у меня не получается писать маленькие тесты. У меня одна функция тестирования может занимать несколько сотен строк кода и я понятия не имею как разбить это на несколько тестов, поскольку вызов одной функции в тестируемом объекте может изменить поведение другой. Правда из хорошего получается почти 100% покрытие кода тестами, однако сами тесты выглядят отвратительно.
И ещё не понятно: нужно ли писать дополнительные проверки на возвращаемое значение из библиотеки, если эта проверка (в случае правильности выполнения кода в библиотеке) никогда не будет выполняться.
> Открой для себя инкапсуляцию.
Это ты спизданул просто так, потому что не знал что ответить, но очень хотелось?
Тупой пидорок, я тебе ответил, но ты слишком тупой, чтобы его понять. Хорошо, смилостивюсь над идиотом и поясню на пальцах для таких тупорылых идиотов как ты.
Тесты, неважно, юнит это или интеграционные (немного иначе с bdd, но суть та же) должны иметь три блока - подготовить запрос. Осуществить тестируемое действие. Проверить результат.
Если тестируется бизнес-логика, то действий и проверок результатов может быть много. При этом действие это действие над блекбоксом и проверка результата, а не хуйня с внутренней реализацией тестируемого компонента.
Впитывай, долбоеб.
Ого какой агрессивный. Это ты, шизопомидорка с собеседованиями?
> . При этом действие это действие над блекбоксом и проверка результата, а не хуйня с внутренней реализацией тестируемого компонента.
Так ты ещё и читать не умеешь. Для проверки корректности работы блекбокса НУЖНО учитывать внутреннюю реализацию. Не будешь же ты тестировать функции объекта ниже исключительно по-отдельности?
public class Foo {
private boolean bar;
public Foo() {
bar = false;
}
public int method1(int a) {
int rv = bar ? a 2 : a;
bar = true;
return rv;
}
public int method2(int a) {
int rv = bar ? a 3 : a;
bar = false;
return rv;
}
}
> Для проверки корректности работы блекбокса НУЖНО учитывать внутреннюю реализацию.
Не нужно. Твердо и четко.
Представь себе тестируемый класс, компонент или систему как китайскую комнату. На вход подаются таблички на китайском, на выходе их перевод на английском. Контракт соблюдается, тесты крутятся, бабло мутится, и вообще поебать сидит ли внутри комнаты китаец или что вообще там происходит.
> ниже
Ниже у тебя отвратительный пример мутабельного класса, чья внешняя функциональность зависит от совершенно не очевидного для окружающих внутреннего стейта. Не говоря уже о том, что не тредсейф нихуя. Это как если бы иногда вместо таблички с переводом, китайская комната отдавала табличку с джастин бибером потому что потому.
На вход такой комнаты нужно подать ведро мочи, поджечь комнату и повесить ее архитектора.
В том, что в геттерах и сеттерха ты можешь провести валидацию\обработку значений, прежде чем положить его в поле или прежде чем отдать его из поля.
Это можно сделать независимо от модификатора доступа. Но если поле приватное, то, по идее, оно не должно как-то выходить за пределы класса, и изменяться, но гет/сет обходят это. Можешь пример ситуации привести, когда это необходимо?
Другое. Поле private. Но при использовании экземпляра класса я, по сути, имею доступ к этому полю по гет/сет методам.
>Но если поле приватное, то, по идее, оно не должно как-то выходить за пределы класса, и изменяться, но гет/сет обходят это.
>Но при использовании экземпляра класса я, по сути, имею доступ к этому полю по гет/сет методам.
Смысл модификатора private не в этом.
Смысл его в том, что другие классы не могут иметь к нему _непосредственного_ (не контролируемого твоим классом) доступа.
А доступ через методы - не обязательно get/set - это нормально.
Потому, что это _контролируемый_ доступ, _специально_ сделанный, с некоей целью.
А то, что ты пытаешься сказать - просто не имеет смысла.
По такой логике приватные поля просто были бы бесполезны, т.к. не могли бы изменяться вообще.
>>74149
Более того - снаружи никто и не знает, что у тебя там есть какое-то приватное поле, и что геттер-сеттер меняют именно его. Там может быть что угодно - вычисления, обращение к бд, и т.п.
Так что приватное - оно и есть приватное.
Т.е. паблик методы - это внешний интерфейс класса.
А внутренние приватные поля - это детали реализации, которые могут меняться, но это никак не скажется на работе клиентов (внешних классов).
это плохая практика - размазывать бизнес-логику по куче классов.
А так геттеры и сеттеры - если внезапно понадобиться многопоточная работа с этим классом - просто повесить syncronized на геттер и сеттер
пруфы?
127.0.0.1
Как более удобней будет полученный лист отсортировать по наиболее подходящим к первоначальным координатам?
Подходящую.
Смысл нет - это просто культ Карго.
Пасаны, расскажите, как устраивались джуниками. Какие вопросы, какая зп, какие первые задания были?
ты пишешь ?
Отсортируй по расстоянию, наркоман. В чем проблема?
Тебе в лицо.
Две координаты - это точка.
Сделай функцию для вычисление расстояния между двумя точками на плоскости.
Сделай компаратор (на базе исходной точки), который в своём compare(p1, p2) сравнивал бы расстояние от обеих точек до исходной, и выдавал бы соотв. результат.
Отсортируй список с этим компаратором.
Можешь использовать для всего этого стрим, если умеешь.
private поле используется для переменных, которые ты не хочешь показывать за пределами класса. Не обязательно подразумевается, что кто-то может запрашивать его через геттер/сеттер, или через оба.
Ok
Бамп вопросу
Егорка-долбоеб.
Почему джавапитухи любят так делать скобки, что они открывающая и закрывающая не находятся друг под другом?
Это static initializers. Можешь погуглить.
Это не "переменные", а _исполняемый_ код.
Там может быть что угодно.
Например, сложная инициализация переменных, создание списков или map и т.д.
Этот код выполняется при первом обращении к классу.
Можешь думать, что это такой конструктор, но для класса как модуля (статические члены), а не для экземпляра объекта этого класса.
конструкторы вызываются в последнюю очередь, поэтому такая аналогия будет губительной для понимимания
В смысле?
Это статический инициализатор (или несколько).
Конструктор - тоже инициализатор.
Но, инициализируют они разные вещи (и по-разному).
Java класс - это два в одном - модуль (набор переменных и функций) и класс (шаблон объекта).
Модуль - это статическая часть. Просто набор переменных и функций, имеющих что-то общее.
Класс - то, что определяет поведение создаваемых (new) объектов-экземпляров.
Общее у них то, что в статической части класса есть доступ ко всем не-статическим членам класса, в том числе приватным. Т.е. если в статический метод класса передать экземпляр объекта этого класса, то там можно с ним сделать то, что "снаружи" сделать нельзя.
Больше ничего общего у этих двух частей нет.
И да, из "классовой" части, естественно, есть доступ к статическим членам. И, вполне логично, что они должны быть проинициализированы до того, как будет создан первый экземпляр класса.
И, если первым обращением к классу является вызов конструктора (new), то статические инициализаторы будут выполнены перед тем, как будет выполнен конструктор.
И это логично и интуитивно понятно.
Чтобы не тратить строчку ни на что и не делать зрительный разрыв между сигнатурой функции и ее телом, сисярподебил.
Ведь строго говоря это просто синтаксический сахар,
следование за модой
Что б отвечать на вопросы типа: как бы вы спроектировали Убер
почему на эту фразу у собеседующих бомбит?
«Этот вопрос не относится к списку профессиональных навыков, заявленных в тексте вакансии. Имею право не отвечать».
мы вам перезвоним
List<Person> nums = new ArrayList<>();
Почему нельзя писать так:
ArrayList<Person> nums = new ArrayList<>();
Так можно писать.
Но, объявив это как более общий тип, ты можешь в дальнейшем поменять реализацию.
Или использовать Collections.emptyList(), или ещё что-нибудь.
В простых программах это кажется избыточным.
Но, это вопрос стиля.
Или его отсутствия.
Нужно считать и создать объекты класса из JSON файла.
Объекты классов bigCar и smallCar, унаследованные от абстрактного Car. Проблема в том, что в JSON могут быть объекты обоих этих классов и какой это класс решат сочетание значений полей maxPassengers и trunkSize.
Надеюсь, понятно расписал. То есть мне в процессе парсинга джейсона надо как-то смотреть на значения этих полей и в зависимости от них создавать уже нужный объект.
Прошу совета.
Не надо делать наследование классов данных, прежде всего.
>в процессе парсинга джейсона надо как-то смотреть на значения этих полей и в зависимости от них создавать уже нужный объект.
Вот так и делай, лол.
А нормально - надо делать свой протокол поверх json - с типами и дженериками.
Чтобы не ебать мозги ни себе ни людям.
Алсо, такая объектная модель - это вообще пиздос.
Так в принципе делать не надо, и дело даже не в наследовании.
Такие вещи надо свойствами как-то делать, а не выдавать тугую струю классов на каждый пук.
В таком формате никак. Во-первых, в жсоне никаких типов нет, сериализатор в душе не ебет, что там надо создавать. Во-вторых, с хера ли у тебя семейство типов базируется на значении атрибута? Нужен всего один класс с двумя методами isBig()\isSmall()
>>75646
Сорян, я пока учусь. Можешь все-таки что-то посоветовать в моём случае? Сейчас читаю про gson, но в большинстве статей описывается типичная изи десериализация из двух строчек кода. Думаю, надо официальную документацию почитать, но реализуемо ли вообще то, что мне нужно с gson или что-то другое смотреть?
Два чаю. Если нужно сериализовать Json с неизвестными заранее полями (например если список нужных полей отправляется в качестве аргумента для API), то пихаю Map<String, Object>. Но вот такого, что заранее неизвестно что при вызове вернёт Json ещё не было. Правда у меня Java приложения Json особо и не получают, в основном всё на xml.
>>75668
Jackson можно использовать в качестве токенайзера. Тогда ты сам, ручками проверяешь каждый токен и строишь нужный объект. А вообще лучше десериализуй Json в HashMap<String, Object> и уже его передай в фабрику, которая и отдаст нужный элемент.
Это не вопрос стиля. Нас не интересует конкретная реализация списка, нас интересует обобщенный список, который, допустим, позволяет итерировать по содержимому. Объявляя конкретный тип, ты связываешь себе руки, так как завтра выяснится, что ArrayList тебе не подходит, а нужен например стек или очередь, и ты будешь две недели вылавливать все места с конкретной реализацией, а потом еще две недели хавать баги.
А обобщенный тип позволяет менять реализацию безболезненно. Поэтому лучше завести себе привычку и постоянно повторять "детали реализации должны быть скрыты от клиента".
об этом и речь. для кода, где этот список используется, достаточно знать, что это какой-то там список, больше этого ему знать не следует.
> выкидываешь из кода важную информацию
Важную в контексте чего?
> Ещё пример - из ConcurrentHashMap делать Map. И пойди догадайся, что это за мапа и потокобезопасна ли она
Тут надо задать вопрос, насколько релевантна тебе потокобезопасность. Если это обязательно, то разумеется сигнатуры надо объявлять так, чтобы потоконебезопасный тип передать было невозможно. А если требуется просто словарь, то ограничиваться ConcurrentHashMap не стоит, т.к. клиенту лишняя работа, не относящаяся к делу. Ну и если это чужой код тебе передает, то следует исходить из потоконебезопасности и может даже явно копировать в ConcurrentHashMap, т.к. сегодня они тебе передали одно, а завтра что-то другое, и оправдания типа "оно упало, потому что меня вызвали с не тем типом" звучат как-то неубедительно.
>Важную в контексте чего?
в контексте реализации и свойств. Сортируются ли значения. Выкидываются ли дубликаты. Допустимы ли null значения
Это важно в конкретных контекстах, см. выше пример с ConcurrentHashMap, в таких случаях да, указывай конкретный тип. А List используй так же, как interface.
Смысл в том, что ты используешь абстрактные List или Map в тех случаях, когда тебе именно что _не_важно_, какой там будет конкретный класс.
А когда важно - используешь более специализированные объявления.
Что тут непонятного?
В общем случае - нужно стараться максимально скрыть детали реализации и ограничиться абстрактным интерфейсом.
https://pastebin.com/pRcV1amm
Вот какого хуя оно так работает?
Потому что главный поток не ожидает завершения всех остальных и сразу выходит из программы. Сохрани все msSecondThread в массив, а потом после цикла с вызовами вызови у всех метод join.
а что ты хочешь? Оно выполняется параллельно, а не последовательно
Сами объекты Thread. Если тебе просто нужно ожидать окончание работы треда, то нужно вызвать метод join у него. Но делать это надо после того как стартанёшь все треды, иначе смысла в многопоточности не будет. Потому все запущенные треды и надо сохранить в массив, а после того как все запустил уже и можно их ждать.
>class AffableThread extends Thread
Вместо этого - implements Runnable.
Каждый раз - новый AffableThread.
А лучше - просто используй лямбду:
new Thread(() -> {...});
В конце надо бы подождать завершения потоков, наверное (не обязательно).
И что тебе не нравится?
Что выполняются не по порядку? Это нормально.
Для этого есть приоритеты, но, и они не гарантируют. Так что, если действительно важен порядок - придётся поебстись. И это хороший повод задуматься - правильно ли ты поставил задачу?
Анон, я понял как через лямбду:
new Thread (() -> {System.out.println("Привет из побочного потока!"+Thread.currentThread().getName());}).start();
Но у меня все равно "Главный поток завершен..." в начале высвечивается
Главный поток завершён...
Привет из побочного потока!Thread-2
Привет из побочного потока!...
>>75724
То есть ты имеешь ввиду, что нужно записывать .getName() в список?
> То есть ты имеешь ввиду, что нужно записывать .getName() в список?
Тут видимо легче показать, чем объяснить.
https://ideone.com/wIQ7wZ
> Но у меня все равно "Главный поток завершен..." в начале
Так и должно быть. Про лямбду я не к этому написал, а вообще.
Потоки - они выполняются _параллельно_.
Главный поток отрабатывает очень (очень!) быстро, и сразу завершается (запустив другие).
Сам он ждать не будет - ты же не просил его ждать. См. в примере выше про join.
Для натуральности - добавь Thread.sleep(50) в лямбду (придётся засунуть в try|catch). Т.к. реальные потоки у тебя же что-то делать должены, в течение некоторого времени (или постоянно).
Потому что программируйте на уровне интерфейсов, а не реализаций.
И да, "if ( i== 5) " там совершенно лишнее.
IDEA тебе бы подсветила это место с комментарием типа "здесь i всегда = 5".
Также, могу тебе посоветовать посмотреть в сторону более высокоуровневых инструментов для многопоточности в java - пакет java.util.concurrent и т.п.
Потому, что работа с голыми потоками - это может быть довольно заёбисто, если делать что-то сложнее хелловорлда.
И особенно - CompletableFuture.
Очень возможно, что именно это тебе и нужно.
> И особенно - CompletableFuture.
Лучше уж пусть изучает Reactor. Тот же Mono в сто раз удобней.
Одно другому не мешает.
И для относительно простых вещей CompletableFuture - просто охуенно.
И если научился - потом переход на всякие Rx'ы и реакторы будет простым и естественным.
Иначе - можно сразу ничего не понять и дропнуть.
Ага, спасибо. Только, честно говоря, не совсем понимаю, зачем HashMap тут. Думал обычным списком или массивом обойтись.
HashMap<String, Object> - это твои объекты, вместо PoJo.
Какой смысл делать ещё какой-то pojo, если, по сути, сырой json-объект - это Map?
Можешь объяснить, что куда должно замапиться?
Весь JSON записывается в String? Или String - это название поля, а Object - это значение? Что, если у меня много объектов в JSONе? Честно не могу врубиться и не получается этот подход нагуглить.
> Честно не могу врубиться и не получается этот подход нагуглить.
Используй кастомный десериализатор (регистрируй его для интерейса) и не парься. https://www.google.com/search?q=java+gson+custom+deserializer
Объект - это набор свойств.
Свойство - это имя (String) и значение (Object).
Map<String, Object> - это объект.
В JavaScript - это даже буквально так и есть, например.
Отсюда и JSON - JavaScript Object Notation.
Много объектов - много Map (список, например).
Скорее всего и весь твой json целиком - это тоже Map. В котором, например, есть свойство cars, значением которого будет List<Map<String, Object>> - список (потенциальных) объектов car.
Как это сделать в gson - я не знаю, т.к. им не пользуюсь (не люблю гуглоподелия, лол).
Но, любой парсер json, как мне кажется, по умолчанию тупо парсит json как Map, в котором есть списки, другие Map и примитивные свойства. Т.е., как написано в json, так и парсит.
Если ты сам решаешь, каким будет формат файла - добавь туда метаданные - информацию о типах объектов в файле. В удобном тебе формате. И тогда сможешь делать автоматическое превращение List<Map> -> List<CarXxx>. BeanUtils используй или своё что-то сделай на рефлекшн.
> Но, любой парсер json, как мне кажется, по умолчанию тупо парсит json как Map
Не. Сейчас все парсят сразу в объекты, а если что-то не получается уже созданные объекты выбрасываются и вываливается ошибка. Так максимально пирформансно же.
> Так максимально пирформансно же.
Т.е. надо заранее знать типы?
В рантайме определять не получится?
Я вообще мало json использую, и у меня есть своя библиотека, с блекджеком и шлюхами. Смотрел gson и нашёл его бессмысленным. Хотя, возможно, он и высокопроизводительный, но мне нужно другое.
> Т.е. надо заранее знать типы?
Там все объекты атрибутами развешивают, чтобы парсер мог понять что и как. Если атрибудтов недостаточно, то пишут свой десериализатор для конкретного класса. Когда встречается этот класс, то этот десериализатор и вызывается.
>Когда встречается этот класс
А как узнать, когда он встречается?
Что вот эта вот хуета - это именно это класс?
В json добавляются метаданные?
Приведу пример:
Есть такой json - {"tuple": [1, "a", 33.3]}.
Я хочу, чтобы это стал объект Tuple3<Integer, String, Double>.
А не List<Object>, как может кому-то показаться.
И что?
> А как узнать, когда он встречается?
Рефлексия. Там где рефлексия не работает (контейнер), то атрибуты.
> В json добавляются метаданные?
Ты изначально даёшь класс, который определяет каким образом надо десериализовать root-элемент.
Да, я так и понял.
И это, в общем случае, нормально.
Но, мне нужно было сделать так, чтобы тип определялся в рантайме - чтобы можно было восстановить список разнотипных сложных объектов, включая коллекции с дженериками.
Единственный способ это сделать - добавить данные о типах в json, и затем в десериализаторе с этим работать.
И, насколько я понял, gson для таких вещей бесполезен.
Если ты не можешь так понять про геттеры и сеттеры, то либо ты слишком имбецил, либо программирование просто не твое.
ненужны
Вот у нас не понимают, что заблокировали половину адресов Амазона в России США и госдепартамент... Этого не понимают... Думаю, что это сделал Путин!
Сап, программач. Толи я тупой, толи аффтор учебника что-то не договаривает. Объясните мне пожалуйста зачем тут переприсваевается переменная. Разве не легче сразу i использовать?
Попробуй переписать код с использованием переменной i. Конечно, если тебя не смущает, что она доступна только в конструкторе.
Зачем он тогда вообще нужен??
Это конструктор для формирования экземпляра класса NonGen,
в него поступает переменная i и после она присваиватся полю num
Гранд М. - Шаблоны проектирования в Java - 2004
если она 2004го года?
Странно, что компилятор не показывает ошибку, а только предупреждение. Может от версии java зависит, а может я уже просто забыл о таком поведении.
У тебя переменая a имеет тип SimpleTriple<Object>, а не SimpleTriple<String>.
Даймонд нужен, чтоб не писать тип, когда с лева он уже определен:
SimpleTriple<String> s = new SimpleTriple<>(...);
он нужен для проверки типов, без него у тебя фактически SimpleTriple<Object>, т.е. можешь не только String добавлять, а все что угодно
Дженерики в джаве появились как раз в 2004-м - в Java 5.
И автобоксинг/анбоксинг тогда же.
Это принципиальные изменения, в том числе с точки зрения паттернов.
После этих изменений джава стала нормальным языком.
Так что, если у тебя _русское_ издание 2004 года, то там, скорее всего, этого нет. Посмотри год издания оригинала и какая версия джава используется.
Мне нужно написать программу,
рисующую 12 фигур разного цвета с разными координатами. Тип фигуры (эллипс, прямоугольник, линия), цвет и расположение выбираются случайным образом. Всякий раз, когда вы изменяете размер фрейма, картинка меняется на новую. Линии должны быть толстенькие.
Ограничение: Вызов метода g2.draw() в тексте программы написан только один раз. Массивы и прочие коллекции не применяйте.
Должно быть что-то типа 1го пика,
во-первых я так и не понял как менять backgroundcolor для JPanel, там какие-то сложности с прозрачностью итд,
потом я не очень понимаю, почему мой код вместо того чтобы рисовать 12 рандомных фигур рандомного цвета выдает 4ый пик,
пусть даже пока что я не поставил им рандомные координаты, но каждый раз стабильно рисуется 1 черная линия и всё,
https://pastebin.com/zA1GuCtM
постить сюда ссылки это моветон. просто пишешь в гугле и методом логической дедукции попадаешь на нужный ресурс.
что там хорошо - там уже всё подготовлено для рисования и узнаешь базовые принципы по обработки иветов етк
И еще, я видел видео на ютубе, которое запостили в 2013м году, где человек как раз создает публичный класс в одном файле с уже имеющимся публичным классом,
получается в предыдущих версиях Java так делать было можно?
>в одном file.java объявлять 2 класса
Не надо так делать.
Независимо от публичности-приватности.
Ньюфагам это, обычно кажется хорошей идеей.
Ну так, на то они и ньюфаги, лол.
Если очень надо - сделай один модуль (публичный класс, имеющий только статические члены), и в нём объяви другие (вложенные) статик классы, с нужными модификаторами доступа.
Потоу что в итоге все равно будут разные класс-файлы и выгоды от этого нет.
Актуальна.
Структурирование кода.
По тем же причинам рекомендуют разбивать большой метод на несколько функций и т.д.
Близкие по смыслу классы помещаются в один пакет (а не файл).
Иерархия пакетов может быть сколь угодно сложной, но злоупотреблять этим не нужно.
А ньюфагу кажется, что несколько мелких файлов - это сложнее, чем один большой.
Но, на то он и ньюфаг.
> @Override
Указывает конпелятору, что метод под ним должен переопределять виртуальную функцию. По факту переопределение происходит по совпадению сигнатуры (т.е. должны совпадать название, типы и количество аргументов и тип возвращаемого значения), а @Override нужен только для контроля и его можно не указывать вообще.
>откуда println() знает
Он ничего не знает.
Он вызывает метод toString() данного объекта.
При этом срабатывает именно переопределённый метод.
Почему?
Потому, что так устроена Java и вообще ООП.
https://www.geeksforgeeks.org/dynamic-method-dispatch-runtime-polymorphism-java/
Имплементировать метод, с помощью которого в армию добавляется новый отряд. Если армия уже укомплектована, должно выводится соответствующее сообщение на экран. Необходимо убедится, что отряды не повторяются, в противном случае вывести сообщение.
Мю у кого-то идеи есть, как это сделать? Как вообще дать возможность клиенту добавлять отряды? Пока наткнулся на enum и загнал их туда, а что делать я не знаю.
public enum Units {
SWORDSMEN(300), ARCHERS(200), CAVALRY(500), DRAGONS(1000), MAGES(800), ARTILLERY(500);
private int price;
Units (int price){
this.price=price;
}
public int getPrice() {
return price;
}
}
Если проще, то клиент может собрать армию из списка отрядов и потом подсчитывается стоимость армии, но дублировать отряды нельзя.
Решение от балды: проверяешь все четыре направления перебором. Если нет вражеского символа на линии - вставляешь свой в свободную ячейку
Да алгоритмы то я уже придумал. Но что-то никак в них не въеду.
Подскажите, как создать персонажа с характеристиками взаимодействия с виртуальной средой, какие надо бубны практиковать? Как дописывать, если я что-то по ходовой придумал и как эту ебалу запилить, чтобы она заработала?
Чоблять? Ты там движок игори пишешь что ли? На джаве? Ты там совсем ебанулся, или совсем ебанулся?
Пиздуй юнити трогать.
Готовы ли вы с этим смириться?
Да. На то мы и используем java. Любители стрелять в ногу. Сидят в других тредах
Я замечал, что люди, не разбирающиеся в джаве обожают нести дикую хуйню про нее.
Можете кинуть ссылку на хороший сервис по изучению Java. В смысле бесплатный и для начинающих. Без видеоуроков. Был бы очень благодарен
if (i/2 == Double){}
/Хочу сделать проверку целого числа, после деления на 2/
>Если нету, то декомпиляция и ковыряние с охуевшим видом в нагромождении говна без комментов
Фикс
> декомпиляция
> очевидно мимокрокодил, а не видевшее некоторое дерьмо повидло
Ну ты хоть немного думай, когда фиксишь чужие поста, ебоклак.
> речь о модах для майнсруфта, которые декомпилируются человеком, у которого из знаний только английский, за полчаса-час (в первый раз, потом за пару минут)
Я первый свой мод (или лаунчер, не помню) для майна декомпильнул именно с такими вот исходными условиями.
А потом всё удолил, потому что не умел в жабу.
Разархивировать джарник и получить java-файлы из class-файлов не сложно. Вопрос что ты с этим будешь делать.
String[] arr = {"aa", "bb", "cc", "dd"};
String gg="";
for (int i = 0; i != arr.length; i++){
gg+=arr+" ";
}
System.out.println(gg);
Переделать в лямбду?
>ArrayList<String> arr;
Спасибо! Но что делать если у меня в коде, допустим, уже есть Arrays.sort(arr); ?
Редьюсь.
String s; //введенное юзером значение
try {
if((s.toLowerCase().contains('e') || s.toLowerCase().contains('.'))
double d=Double.parseDouble(s); //вещественный тип
else
long l=Long.parseLong(s); //целый тип
}
catch(NumberFormatException nfe) {
//строчный тип
}
Либо заменить на Collections.sort(list), либо сделать из массива список с помощью Arrays.asList(array).
Дебилы не задерживаются. Иди дальше, идиотский человек.
нинужна
Как вариант - одну из тех, которую поддерживает JDBC.
Вобщем мне надо написать лаб по яве. Нужно добавить класс, представляющий единицу, описанную в динамическом векторе основного класса. Я особо не понял данную задачу поэтому реквестирую помощь
Понадобилось сделать четыре вложенных друг в друга try-catch. Понял, что мой редактор joe мало чем может помочь.
В каком редакторе/IDE легко и просто делать вложенные try-catch?
> В каком редакторе/IDE легко и просто делать вложенные try-catch?
А что мешает без задней мысли написать их ручками?
>А что мешает без задней мысли написать их ручками?
Отступы для удобочитаемости и можно по невнимательности упустить/добавить фигурную скобку
аноны подскажите плес хотябы что надо гуглить
Проблема в разных потоках. Вопрос в том, как это по-хорошему должно решаться.
Спасибо, анон.
enum байтов.
Чё блядь? Чё за динамический вектор? Имеется ввиду java.util.Vector, что ли? А чё за "основной класс"?
Насколько я понял, надо в отдельном классе создать нужые обьекты. А в основном классе создать ArrayList где будут использоваться данные обьекты. Как-то так.
почему нельзя едитить сообщения на дваче блядь
Нахуя? Нельзя обработать всё в одном по разным типам эксепшонов?
Ах ты, сука.
"Единица" - это unit наверное?
И всё равно текст остаётся загадочным.
"Единица в динамическом векторе основного класса" - хорошо звучит.
В России такое любят.
С таким названием мог бы быть доклад на форуме "Территория смыслов", например.
>Попробуй intellij idea.
Попробовал, вещь супер!
1. Пишу:
PreparedStatement
IDE дописывает:
import java.sql.PreparedStatement;
PreparedStatement
Раньше, чтобы узнать, что писать после слова "import" я тратил кучу времени.
2. Выделил несколько строк, нажимаю Ctrl+Shift+T, IDE предлает упаковать в try-catch, как в сказке!
https://libgdx.badlogicgames.com/
http://www.libgdx.ru/
https://habr.com/post/243471/
>ответ юнити
Ну ты кек вообще. Пробовла его на мобилки. Если коротко то более-менее он подходит для 2д, в 3д не лезь блять. А еще там хуйня с iOS, так как пидорские майкрософт купили купили и закрыли RoboVM, что бы не мешал Xamarin'у, и было два варианта, мутный Intel ME, или старый молумертвый форк RoboVM - BugVM.
Я хочу написать RPG типа Fallout 1-2 или Arcanum, но с вращаемой/перемещаемой камерой (как в Neverwinter Nights и WarCraft 3). Вид от 3-го лица, бои пошаговые. Подойдет ли оно для этого?
Теоретически да, но я так и не смог заставить нужные мне модельки работать, постоянно то ли текстуры, то ли нормали отклеивались, а из готовых из интерента вроде норм. Но опять же с 3д он так себе. А у тебя именно что 3д.
Во всём.
Профессиональный вкатывальщик.
эксепшен ты сам кидаешь? Если да, то не надо так. Эксепшен это дорогая операция, плюс это должно быть что-то исключительное, эксепшенов не должно быть при корректной работе.
Сделай функцию, возвращающую boolean, и дёргай это функцию
Я проверяю на некорректный ввод. Если ввод некорректный, кидаю сам кастомный эксепшен и прошу пользователя повторить снова (для этого цикл). это учебное приложение, один из пунутов задания придумать кастомные эксепшены
Так в итоге и сделал. Просто думал, мб есть способ это нормально хэндлить. Спасибо за ответ.
Elasticsearch
Возник вопрос, до какой степени джуну надо знать Хибернейт, Спринг(и что именно надо знать)?
А ты думал мы вам перезвоним просто так сто сорок пятый тренд идет?
proxyTargetClass=true означает: использовать cglib-прокси, даже если есть интерфейс. Если нет интерфейса, будет cglib как единственный возможный вариант.
спасибо
спринговый эксепшен? Чот не помню такого
Суть такова:
обмазываюсь видеокурсом про спринг (тру-посоны в комментах на рутрекере поливают автора и курс говном, но ничего лучше т.е. просто ничего на русском не нашёл), там нужно поставить glassfish, mysql, затем создать БД и подключиться к ней из glassfish. БД создал, даже немного данных добавил в таблицы - всё норм. Пытаюсь теперь создать пул подключений: ввожу нехитрые настройки (пользователь, пароль, url), сохраняю, жму Ping и... нихуя! Вылезает ошибка
Ping Connection Pool failed for MySQLPool. Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource Please check the server.log for more details.
Порылся в интернете, нашёл очень полезный совет - положить jar-ник с драйвером в директорию домена, а не просто в глассфиш/либ. Положил по всему пути до ext'a в глассфише теперь лежит этот файл, перезапустил и всё равно ничего не получается. Может быть кто-то сталкивался с подобной проблемой или может просто указать мне на ошибочные действия, которые приводят к подобному результату?
Правильно, что читаешь.
А переводить не нужно.
Учись понимать английский без того, чтобы переводить его при чтении. Иначе - это тупик.
>т.е. просто ничего на русском не нашёл
Умри
>ошибочные действия, которые приводят к подобному результату
Ошибочные действия - пытаться что-то делать с glassfish, он не нужен (как и другие ASы)
> java
https://computer76.ru/2018/04/16/javac-cmd-error/
Установка Java не относится к насущной проблеме при работе в любой операционной системе, причём при некоторых условиях даже НЕ РЕКОМЕНДУЕТСЯ.
желательно сначала освоить хотя бы Шилдта не для начинающих, ну или его альтернативы
ты думаешь он что-то поймет в спринге после Шилдта для начинающих? не знаю, не знаю
Ну, мне в свое время хватило общих знаний языка (по какой-то вузовской методичке) + AWT & Swing.
В той книге все хорошо разжевано для начинающих.
https://docs.oracle.com/javase/10/
Кстати, нужно ли еще что-то знать из Hibernate, кроме использования его как реализации JPA?
Там есть какой-то свой встроенный язык запросов - его спрашивают на собеседованиях?
sql учить придется в любом случае, всякие jpql на нем основаны и не особо от него отличаются; думаю ты должен уметь выполнять crud операции в hibernate/jpa, знать основные аннотации и подобные базовые вещи
Именно язык запросов там практически тот же самый, что в JPA. Есть свой criteria api, который ныне объявлен deprecated, несмотря на превосходство над ущербными JPA criteria.
В реальном мире скорее всего придется столкнуться со спецификой Hibernate, но для собеседований должно хватить и JPA.
можно ли говорить на собеседовании, что я предпочитаю не использовать hibernate и jpa?. Ибо от них одни проблемы без заметной пользы
Мне jooq больше нравится. Но в каждой вакансии Hibernate и Spring.
Можно, если сумеешь аргументировать. Адекваты понимают, что hibernate/jpa как минимум хороши не во всех ситуациях.
в простых проектах проще руками пару запросов накидать.
В сложных уже нельзя доверять автогенерации и нельзя выгружать весь граф объектов.
Итого нет применения
Так может просто и не ходить туда, где важен hibernate? Не так уж и в каждой он вакансии. Но в любом случае, на собеседовании в адекватной конторе умение осмысленно и по существу раскритиковать hibernate вполне может заменить его глубокое знание.
Сходу выдашь свой отсутствующий опыт. В узких местах запросы пишутся ручками, но в большинстве крупных проектов без orm никуда - другой вопрос, что некоторые умники сперва пердолят свой запрос на каждый чих, а со временем всё это обрамляется в тот же orm, только хуёвый.
>>81635
>в простых проектах проще руками пару запросов накидать.
Внезапно, тебя не будут нанимать ради хелловорлдов с "парой запросов".
>В сложных уже нельзя доверять автогенерации и нельзя выгружать весь граф объектов.
Ты не понимаешь технологию, если не видишь ей применения.
>предпочитаю не использовать hibernate и jpa?
А MyBatis (бывший iBatis)?
Это хороший компромисс.
>Ты не понимаешь технологию, если не видишь ей применения.
У меня есть технология изготовления фигурок из говна, найдёшь ей применение?
Если нет, видимо ни ты ни я просто не понимаем её.
Попробуй ещё раз и без использования говна. Уверен, у тебя получится.
И как ты думаешь, если тысячи зрелых специалистов используют технологию, а ты "не видишь ей применения", то у кого проблемы с пониманием - у тебя или у них?
>если тысячи зрелых специалистов используют технологию,
Миллионы мух не могут ошибаться, да.
Люди чего только не делают.
И на джаве в том числе.
И что?
Я другой анон, если что.
И тоже не считаю jpa и hibernate хорошим делом.
Как и спринг.
Всё это ненужная монструозная хуйня.
Сынок, чтобы тебе было понятно, о чём я - посмотри на продукты Caucho, например.
Или на тот же MyBatis.
Это примеры несколько иного подхода, нежели обычно принятый в джава-разработке.
А коммерческий успех, в наше время, далеко не всегда свидетельствует о качестве продукта.
И да, 95% чего угодно - говно, но, оставшихся 5% мне вполне достаточно.
Щень пытается общаться снисходительно - какая прелесть. Чешет о монструозных продуктах и приводит в пример майбатис - один аргумент лучше другого.
У тебя есть что-нибудь по делу, или ты так, попечатать зашёл?
По делу тебе уже всё сказали, и даже не один раз, лол.
А суть твоей аргументации - все так делают.
Охуенно.
И да, у тебя совсем не бомбит, как я погляжу.
>но в большинстве крупных проектов без orm никуда
никуда без выгрузки всего графа объекта? Так делать нельзя в любом случае
>Ты не понимаешь технологию, если не видишь ей применения.
глупость. Есть куча "технологий" без применения
>MyBatis
смотрю на мануал
https://www.concretepage.com/mybatis-3/mybatis-3-annotation-example-with-select-insert-update-and-delete
@Results({
@Result(property = "vid", column = "id"),
@Result(property = "villageName", column = "name"),
@Result(property = "district", column = "district")
})
@Select("SELECT id, name, district from village WHERE id = #{id}")
Village selectVillage(int id);
По мне так это хуже ручного маппера. Оно не проверяется при компиляции, IDE не будет переименовывать эти поля при рефакторинге, оно будет падать в рантайме.
Плюс в маппере можно делать преобразования, помещать некую логику
Это JdbcTemplate с запросами в аннотациях? Не вижу преимущества перед простым JdbcTemplate
Лучше ебатис.
Хибернейт выебал жука и высрал ебин :)))
Бля, как же я хочу научиться излагать мысли так как ты. Ты это тренировал или впитал с окружением? Сколько времени ты писал этот пост? Исправлял что-нибудь или тупо поток мыслей записал?
>Ниже у тебя отвратительный пример мутабельного класса, чья внешняя функциональность зависит от совершенно не очевидного для окружающих внутреннего стейта.
так мы дойдём до ненужности ооп. Ибо основа ооп это внутреннее состояние объектов, что есть плохо по современным критериям
Чоблять? Я просто ответил на пост без задней мысли. Я тебе такое и ирл с наскока высру, только без двощесленга про жопы и ссанину.
> Ты это тренировал или впитал с окружением?
Книжки в детстве читал и потом сидел в психотронной тюрьме. Не рекомендую.
>>82191
Egorka-dolboeb, eto ti? Ни одна из парадигм ООП ничего говорит про стейт объектов. То, что сущность заявляет, что она кошка и умеет мяукать с пруфами ничего не говорит о внутренней реализации кошки. Лишь о том, что она умеет мяукать и к ней можно спокойно обращаться как к кошке.
Если на девятое по счету мяуканье кошка взрывается нахуй и осколками посекает погладившего лишь говорит, что эта кошка говно. Хотя тут главное не дойти до нужности чекд экспепшнс и ненужности анчекд, но тут тонкая грань - внутренний стейт приносит неочевидность для внешнего наблюдателя и кучу других проблем, а анчекд экспепшнес стейтлесс каках это заебись.
сам объект "кошка" предполагает, что это отдельный объект с отдельным стейтом. Иначе зачем вообще делать это объектом?
Итого сама концепция стейта (и ооп) это нарушение инкапсуляции - стейт может поменять кто угодно, в том числе всякие наследники. В отличие от функции с ограниченным и заранее определённым набором входных параметров.
ооп нарушает инкапсуляцию и порождает ворох проблем из-за стейта
Егорка, ты что тут делаешь?
> сам объект "кошка" предполагает, что это отдельный объект с отдельным стейтом.
Додумываешь. Объект кошка предполагает, что он умеет мяукать, жрать и срать - удовлетворение контракта кошки. Всё.
> Итого сама концепция стейта (и ооп) это нарушение инкапсуляции - стейт может поменять кто угодно, в том числе всякие наследники.
Чоблять? Стейт, может быть, может не быть и может быть недоступным наследниками. И если у конкретной кошки есть стейт, доступный наследниками, то расширив эту конкретную реализацию кошки и поменяв в наследнике стейт, то это лишь станет стейтом новой наследной реализации кошки и никуда он торчать не будет. Икапсуляция схоронена. И тут мы подходим к мысли, что стейт это неочевидно, хуйова, хуйова тестируется, не тредсейф и вообще неидемпотентная ссанина говна червя.
> ооп нарушает инкапсуляцию
Ты упорот там? Инкапсуляция это один из столпов ооп.
> порождает ворох проблем из-за стейта
Еще раз. ООП ничего не говорит про стейт. Стейт привносят говнокодеры там, где он не нужен, а потом задаются вопросом КАК ЖЕ ЭТО НАЗЫВАЕТСЯ ТЕСТИРУЕТСЯ?
Вот типа такой хуйни
>>73889
> Объект кошка предполагает, что он умеет мяукать, жрать и срать - удовлетворение контракта кошки. Всё.
тогда хватит статик методов, без создания объектов.
А если нужна кошка1 и кошка2, и они должны отличаться в один момент времени - это значит внутри стейт.
Так вот, создание объектов, создание кошки1 и кошки2, предполагает наличие у этих объектов состояния. Иначе нет смысла создавать объекты, можно просто статик методы хуячить.
>Стейт, может быть, может не быть и может быть недоступным наследниками.
наследник может сломать метод своего предка. Т.е. нарушена инкапсуляция, метод можно сломать извне
>Ты упорот там? Инкапсуляция это один из столпов ооп.
Скорее это столп функциональщины. Только функциональщина предполагает чёткий контракт и чёткий набор входных параметров
>ООП ничего не говорит про стейт. Стейт привносят говнокодеры там, где он не нужен
ООП это стейт. Пчёлы это мёд. Не бывает пчёл без мёда
отличная аргументация
Не надо использовать аннотации.
Там есть xml маппер.
И да, если ты не понимаешь, зачем всё это, и чем это лучше хибернейта, то тебе это просто не надо.
Речь шла не о том, что хибернейт не нужен, а о том, что не стоит его использовать повсеместно.
> тогда хватит статик методов, без создания объектов.
Ебать у тебя отрицание пошло, уже до процедурщины скатился.
> А если нужна кошка1 и кошка2, и они должны отличаться в один момент времени
Да што ты? Кошка1 и кошка2 это кошки и обращаться с ними можно как с кошками. Если кошка2 требует для работы ниибацца стразы как у того кузнеца, то она должна быть реализована отдельным сортом кошки. Или вообще не кошкой, если не тянет. Стейт тут не при чем.
> наследник может сломать метод своего предка. Т.е. нарушена инкапсуляция, метод можно сломать извне
А-а-а, нихуя. Это лишь будет сломанный сорт наследника. К нему по-прежнему можно обращаться как к предку, вот только хуйова он будет все делать. Ну такой наследник, щито поделать, ничего неожиданного в рантайме.
> Скорее это столп функциональщины.
Вот тут ты спалился, что вообще нихуя не разбираешься в ООП и ФП. Сейчас ты открываешь википедию и читаешь про ООП. Подумай почему инкапсуляция является первейшей парадигмой.
Потом открываешь статью про ФП и неожиданно узнаешь, что оно про функции, а не про объекты.
> ООП это стейт
Повторение аргумента не усиливает его. Особенно если он некорректен. Пиздуй читать википедию.
И когда устроишься на свою первую работу - не увлекайся стейтфул дрисней, бо обоссут нормальные программисты.
Хочу программить на джаве, но у меня ХР стоит и ни чего с оф. сайта не устанавливается, подскажите что от куда скачать надо что бы на хрюшу установилось. Спс.
>Там есть xml маппер
тоже текстом?
Я и говорю, что лучше код чем текст
>И да, если ты не понимаешь, зачем всё это, и чем это лучше хибернейта, то тебе это просто не надо.
Я не понимаю чем это лучше простого JdbcTemplate
окей. Зачем тогда создавать две кошки? Может есть какая-то причина?
Если они совершенно одинаковые, то хватит и одной кошки
>Это лишь будет сломанный сорт наследника. К нему по-прежнему можно обращаться как к предку, вот только хуйова он будет все делать. Ну такой наследник, щито поделать, ничего неожиданного в рантайме.
т.е. нужно повторно тестировать все методы предка в наследнике? Это и есть нарушение - оттестированные методы можно сломать, и нужно постоянно проверять на работоспособность старый оттестированный код
адепты почему-то думают, что любое тестирование это абсолютное добро. И чем больше тестирования тем лучше
> окей. Зачем тогда создавать две кошки? Может есть какая-то причина?
Нужны разные кошки. Одна серая, другая красивая, третья мяукает охуенно.
Например стратегия доступа к данным. Одна к кассандре, другая к жбод какахе. Обе реализуют один интерфейс. Не стоит делать один объект с двумя по сути одинаковыми методами. Это чтобы ближе к телу аналогия.
> т.е. нужно повторно тестировать все методы предка в наследнике?
Нужно тестировать выполнение ожидаемого от объекта контракта. Выполнение контракта происходит - заебись, погнали дальше. Нет - ti okhuel blyat.
>>82242
> тестирование не нужно
Иди нахуй.
>Одна серая, другая красивая, третья мяукает охуенно.
cat1 = new Cat(grey)
cat2 = new Cat(white)
cat1.fuck(cat2)
или ты на каждый цвет будешь делать наследника?
И чистые функции с другой стороны
boolean fuckTwoCats(cat1Color, cat2Color){
}
Ебать ты долбоеб, братишка. Земля тебе пухом.
>никуда без выгрузки всего графа объекта? Так делать нельзя в любом случае
ORM не заставляет тебя выгружать весь граф объектов
Что не так со спрингом? Отличные микрофреймворки для построения микросервисов и работы с конкретными доменными сферами.
самое главное. Если есть заветная цифирка 100% - значит багов нет, блябуду
он создан именно для этого. Для реляции объектов на базу и обратно. Т.е. на заполнение графа связей объектов
За лишний стейт, и что ооп не про стейт, а про парадигмы ооп и про объектное представление данных тебя уже обоссали.
Ты кукарекнул зачем создавать две создавать две кошки и какая этому причина и я привел конкретный пример стратегии доступа данным, объединенных одним кошачьим интерфейсом.
>>82274
Еще один.
Или ты один анон?
>Ты кукарекнул зачем создавать две создавать две кошки и какая этому причина и я привел конкретный пример стратегии доступа данным, объединенных одним кошачьим интерфейсом.
ты привёл пример необходимости стейта у объектов. Как ты будешь выражать цвет кошки?
>а про парадигмы ооп и про объектное представление данных тебя уже обоссали.
ты сам себя обоссал
>Или ты один анон?
таки да
> микрофреймворки
> микросервисов
Можешь привести пример (дать ссылку) минимального приложения на спринг - опубликовать один маленький pojo как веб сервис?
Хотелось бы сравнить с Baratine.
шо оно делает?
> ты привёл пример необходимости стейта у объектов.
Да ты же сам с собой общаешься! Читаешь не то, что тебе отвечают, а то что тебе хочется читать. Впрочем, причины понятны - ты просто не понимаешь, в силу низости интеллекта, что тебе говорят.
> ты сам себя обоссал
> таки да
Хах, так и знал. Не понимает ООП, несет какую-то хуйню, отрицает необходимость и ограничения сферы использования ОРМ, мелкобуква. Надо было сразу послать необучаемого егорку-долбоеба нахуй и не тратить на тебя время.
Сколько лет сижу на бордах, но ни разу правило не нарушалось - если он мелкобуква, значит он в итоге окажется идиотом. Никаких исключений за годы. Все начинается с мелочей.
>>82279
Гугли spring data rest - пишешь модель и интерфейс репозитория и в рантайме будут тебе и реализация репозитория, и круд какахень реста.
это саморефлексия такая?
Я тебе уже пятое сообщение талдычу, что объекты это стейты, ради стейтов объекты и делают
Несколько кошек потому-что они разные кошки, разность выражается через стейт. Стейт можно менять
Что тебе тут непонятно?
>spring data rest
Погуглил.
Хуйня какая-то.
Где там публикация _pojo_ как веб-сервиса?
В этом вашем спринге на каждый пук - тугая струя какой-нибудь бессмысленной хуйни.
Очень напоминает гуглоподелия.
Кстати, Гугол его не купил ещё?
>spring data rest
это очередная магия по генерации sql/hql из названия методов. Зачем это нужно? Хз как по мне. Очередная "крутая" хрень для хэллоуворлдов
Не нужна. Но есть, раз анон просил.
В продакшене если так уж нада существуют data api платформы, но с ними есть нюансы.
>Очередная "крутая" хрень для хэллоуворлдов
У меня такое ощущение от спринга в целом, лол.
Я понимаю, что я не совсем прав, наверное, но ощущение именно такое.
Представляю, насколько это всё раздувается в реальных больших проектах.
>минимального приложения на спринг - опубликовать один маленький pojo как веб сервис?
Иными словами, hello world rest?
https://projects.spring.io/spring-boot/
Для реактивных хипстеров теперь еще есть webflux
Таки а в слове весь тебе какая часть была непонятна?
Только практикой, как ещё?
Читать теорию без практики - бессмысленно.
Алсо, большинство вещей, обычно не понимаемых ньюфагами - не специфичны для конкретного языка.
И да, не стоит слишком много и сразу от себя хотеть. То, что ты только что рассказал - совершенно нормально.
Ты слишком строг к себе. Всё, что ты написал, нарабатывается практикой. Могу посоветовать использовать листик и бумажку с некоторыми алгоритмами, чтобы буквально видеть что должна вывести программа, и что она выводит на самом деле.
Проблема была не в алгоритме, а в моем незнании, что массив является ссылочным типом, очевидно, что такой проеб на собесе = вылет с него нахуй. И при этом я наверняка смотрел видос с полгода назад, писал на это код, но снова забыл из-за неиспользования, а ведь типы это азы. Старый даун похоже, нихуя не запоминаю последнее время, даже что постоянно делаю.
После определенной итерации проеба ты будешь вспоминать, почему он может возникнуть. Просто больше пиши и, что самое главное, постоянно.
Так чего ты так зациклился на ссылочных типах, все что не примитив - ссылка. Если метод не возврщает объект, то это может быть мутатор и тд.
Орнул чет. Яркий пример встречи с реальностью человека для которого орм это серебряная пуля и избавление от sql.
order by id desc
limit 1;
Ну вроде не осталось на планете людей, которые топят за ненужность знания хоть каких-то основ sql даже при работе с орм. Но этот и правда совсем макакен.
Подскажи пожалуйста, можно ли реализовать запись Key + Value в Hashmap через scanner?
Например каждый .put будет разделяться ";" (один put == одной книге)
Вначале я записываю имя книги(String) -> Enter -> true или false(Boolean) -> ; -> следующая книга -> когда список книг закончился, то пишу ключевое слово STOP(константа EXIT_KEYWORD)
и мне выводится список книг с true\false (прочитана\нет)
на пике мой говнокод, работает через жопу
public static void main(final String[] args) {
Hashtable<String, Boolean> books = new Hashtable<String, Boolean>();
ArrayList<String> bookArray = new ArrayList<String>();
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String bookName = in.next();
if (EXIT_KEYWORD.equals(bookName)) {
break;
}
bookArray.add(bookName);
boolean isCompleted = in.hasNextBoolean();
books.put(bookName, isCompleted);
// in.useDelimiter(";");
}
for (Map.Entry<String, Boolean> entry : books.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
Подскажи пожалуйста, можно ли реализовать запись Key + Value в Hashmap через scanner?
Например каждый .put будет разделяться ";" (один put == одной книге)
Вначале я записываю имя книги(String) -> Enter -> true или false(Boolean) -> ; -> следующая книга -> когда список книг закончился, то пишу ключевое слово STOP(константа EXIT_KEYWORD)
и мне выводится список книг с true\false (прочитана\нет)
на пике мой говнокод, работает через жопу
public static void main(final String[] args) {
Hashtable<String, Boolean> books = new Hashtable<String, Boolean>();
ArrayList<String> bookArray = new ArrayList<String>();
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String bookName = in.next();
if (EXIT_KEYWORD.equals(bookName)) {
break;
}
bookArray.add(bookName);
boolean isCompleted = in.hasNextBoolean();
books.put(bookName, isCompleted);
// in.useDelimiter(";");
}
for (Map.Entry<String, Boolean> entry : books.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
Если формат типа такого:
Book1;true
Book2;false
То бери от сканнера nextLine, а потом split по ;
Используй хэшмап вместо хэштейбла. Загугли причину.
Ты добавляешь книги в свой bookArray, но не используешь его. Зачем?
Пикрил.
Огромное тебе спасибо.
В декабре 2016-го была представлена Java SE 6, которая включила в себя стек web-сервисов и 4 технологии Java Enterprise Edition, среди которых оказались JAF, JAX-WS, Common Annotations for Java и JAXB. Время шло, и версии EE стремительно развивались, так что возникало несоответствие данных технологий, а техническая поддержка двух редакций только усложнялась. Вскоре, когда появились автономные версии Java Enterprise Edition на независимых ресурсах, было объявлено об отсутствии надобности включать их в JDK и Java SE.
Даже сейчас некоторые ПО, разработанные на базе JDK для API и инструментов Java EE, не запускаются и даже не компилируются. 6-8 версии повлияли на усиление несовместимости. В итоге представители Oracle сделали заявление о том, что разработчики могут развернуть альтернативные версии Enterprise Edition.
А вот архитектура CORBA и вовсе признана пережитком прошлого, так как ее истоки лежат в далеких 90-х. Oracle не выявила интереса к созданию современных приложений на базе CORBA, да и стоимость поддержки перевешивает получаемые преимущества.
На данный момент не существует версий CORBA, которые бы поддерживались независимыми разработчиками, да и вряд ли кто-то захочет взять на себя бремя поддержки API.
Что же касается JavaFX – модули будут удалены, и в дальнейших планах обновления, которое производится раз в 6 месяцев, они не появляются.
Нихуя не понял, java ee официально отдана эклипсу и больше не будет поддерживаться? Объясните на пальцах, что это значит вообще.
Так и как теперь интерпрайз делать? Грузить все лабы с левых репозиториев? Старый интерпрайз код на новой джаве не взлетит? И нахер это все делать, если джава только на ее и выживала.
>джава только на ее и выживала
Охуительные истории, браток.
Хочешь поддерживать ЕЕ легаси - не меняй версию на проекте.
>Грузить все лабы с левых репозиториев? Старый интерпрайз код на новой джаве не взлетит?
Из Java SE (jdk) выкидывают куски Java EE, которые там зачем-то были. Из самих EE-серверов они никуда не денутся. В любом случае с репозиториями в чем проблема? Грузи не с левых.
>Так и как теперь интерпрайз делать?
Как и раньше, на спринге.
>но в большинстве крупных проектов без orm никуда
Ты понимаешь, что это убогая попытка адаптировать реляционные отношения и реляционную алгебру к объектам в Джаве? Типа, в начале удобно, точнее, иллюзия удобства, а потом огребаешь кучу багов, многие из которых еще и хуй найдешь.
Погугли про lazy load что-ли. Хибернейт ему выгружает весь граф видите ли, ну охуеть
Вначале подключаешь инструмент, а потом блокируешь его функциональность. Очень удобно.
Добавлю, что с этой лэйзи очень много ебли. Думаешь просто-так по-умолчанию стоит игер?
>Думаешь просто-так по-умолчанию стоит игер?
Думаю, просто так. С дефолтным lazy было бы гораздо лучше
Благодарю анон!
>попытка адаптировать реляционные отношения и реляционную алгебру к объектам в Джаве
Это всего лишь маппинг результатов выполнения запросов в объектную модель. Внезапно, реляционная модель хорошо вписывается в ОО.
>огребаешь кучу багов, многие из которых еще и хуй найдешь
Не было значимых проблем ни на одном проекте. Возможно потому, что читали доки и понимали, что вообще происходит, а не пытались наговнять что-то работающее. Попробуй, рекомендую.
>>83315
Если для тебя орм - это хуяк хуяк и наконецта появились какие-то объектики в выполнении - да, конечно, отключение lazy loading'а может выглядеть как
>подключаешь инструмент, а потом блокируешь его функциональность
>Это всего лишь маппинг результатов выполнения запросов в объектную модель
всезапно, это решает один написанный маппер. ОРМ снова не нужна
>Не было значимых проблем ни на одном проекте
значит это галера с гостевыми досками. Нахуячили что-то работающее, сдали, а дальше хоть трава не расти
>Если для тебя орм - это хуяк хуяк и наконецта появились какие-то объектики в выполнении - да
а для чего ещё?
И вот смотрю я на это и думаю - если писать каждый необходимый запрос на голом SQL (или даже на jooqе), не заебусь ли я еще больше, чем от хибернейта. Вы делали что-то подобное без ORM? Жив ли брат?
Хэйтящие инструмент, при этом даже не спрашивая область применения и проект - это либо фанатики, либо студентики, у которых споры на тему самого лучшего языка программирования уже стихли, но мозги пока не проклюнулись. Спорить бесполезно что с одними, что с другими, один хуй ничего из себя не представляют.
> N связанных сущностей с фактами об этом заказе и дохера бизнес-логики, в которой в разных местах нужно вытаскивать этот заказ и что-то из этих N в разных комбинациях и по разным условиям.
а хибернейт думаешь магией оперирует? Он либо достаёт все связанные объекты (на каждую связанную сущность отдельный запрос) и помещает это в память (тут главное не проебаться, чтобы он не начал тащить лишнего), либо опять-же надо писать запросы на hql, который хуже чем голый sql
скатертью по жопе
>Он либо достаёт все связанные объекты (на каждую связанную сущность отдельный запрос)
Отличная история. Если ты не нахуевертил с конфигом, то запросы будут оптимизироваться, исходя из того, что один большой запрос выгоднее сотни мелких.
т.е. надо читать книжку, чтобы заставить "инструмент" не косячить. А баги там исправлять случайно не нужно?
>Что же касается JavaFX
Ну, я ещё хуй знает когда говорил, что Оракл слил это дело.
Формально они это заопенсорсили, типа - кому надо - пишите.
Ни компонентов нормальных, ни хуя вообще нету.
И в опенсорсе такие вещи не появляются, это слишком дорого.
Короче - пизда FX'у.
Да и хуй с ним.
Мертворожденная хуета.
Кому оно нравится, те просто не пробовали писать ничего серьёзного на нём.
Зато Swing будет поддерживаться минимум до 26 года.
И дальше будет, я думаю, куда эти бляди денутся, лол.
Если ты себе в ебло лопату вколачиваешь, то это не вина инструмента.
Такие потом и кричат, что орм - это сложна, поэтому нинужна.
мартышки плакали, кололись, но продолжали жрать кактус
>а хибернейт думаешь магией оперирует?
Хибернейт вполне реально заставить вытаскивать только то, что тебе нужно в данный момент (если не ставить везде изначально eager), причем джойном. Но да, для этого надо не быть дебилом и читать книжку, отсюда оговорка про сложность инструмента. По своему опыту я скорее склоняюсь к тому, что для многих проектов эту сложность оправдывает отсутствие необходимости писать руками миллиард sql-запросов, но послушал бы success story полностью отказавшихся от ORM.
> lazy load
Лютая хуита. Если мне и надо будет использовать ORM, я всегда буду отключать эту хуйню и загружать данные исключительно ручками (оно же eager loading).
Что толсто? Конкретно в жаве я с ORM дело не имел, однако в EF можно было либо загрузить только основные данные, а косвенные данные (например ссылка на другой замапленный объект) он загружал по первому запросу (что и есть ленивая загрузка), либо ещё при загрузке начальных данных указывать какие косвенные данные надо сразу загрузить (это и называлось eager loading). И ленивую загрузку я всегда отключал, ибо нинужно.
В контексте >>82147 на которые ты отвечал, lazy относилось к описанию связей на уровне сущностей, а не на уровне конкретного запроса. Это нужно, чтобы случайно не вытянуть полБД в нагрузку к одному объекту. Т.е. в хибернейте "загружать данные ручками" (а это единственный здоровый вариант) означает поставить для всех связей lazy и описывать на уровне запроса, какие связи подтягивать, о чем и шла речь.
>но послушал бы success story полностью отказавшихся от ORM
Начинал проект на хибернейте. Как вышло в прод - полезли пиздецы.
Например : оператор открывает карточку заказа, в это время водитель берет заказ, меняя у него статус. Оператор нажимает сейв, и объекту ставится старый неактуальный статус. Водила жалуется, что у него пропал взятый заказ.
Ставить блокировку при открытии карточки заказа? Нельзя, водилы будут жаловаться, что приложение зависло.
Как решил? Сделал отдельный метод для операторской правки - оно правит только нужные поля, и метод для взятия заказа - оно правит другие поля.
Как это сделать хибернейтом? Я не знаю. Хибернейт апдейтит все поля разом.
Дальше. Перед отправкой объект надо преобразовать из entity формата бд в dto формата клиента. Я делал это через конвертер.
Т.к. запросов было много, это преобразование кушало очень много памяти. Сделал jdbc маппер, чтобы оно конвертило сразу в dto внешней системы. Потребление памяти упало вдвое.
Постоянные запросы сущности по ид. Хуй знает кто их вызывает, и они были в огромном количестве. Избавился от них только отказавшись от хибера, написав все запросы руками. Тоже упало количество запросов к бд вдвое, снизилась загрузка цп.
Как нормально делать? DAO для каждой сущности, внутри методы получения этой сущности по определенным полям.
Если сервис методу нужны какие-то сущности, то он через эти dao их получает
Не блокируешь, а корректируешь. Дефолтные настройки подойдут для сэмплов и небольших проектов, а дальше уже тюнишь постепенно, сперва lazy load, потом 2nd level cache, потом и до чистого sql доходит в критичных местах
Всё правильно.
Explicit is better than implicit и всё такое.
Но школоте и мамкиным сеньёрам похуй, разумеется.
Особенно интересным такое кино становится, когда тебе надо одновременно работать с двумя физическими БД в одной транзакции, например.
>DAO для каждой сущности
Сейчас набегут модные девелоперы на гироскутерах из кофешопа и, расплёскивая смузи, расскажут, как сильно ты отстал от моды.
Недавно только читал такое в одной книжке.
DAO is old fashion, suka bljad.
Спасибо. Собственно, самый интересный вопрос тут - что в конечном счете оказалось бы эффективнее по трудозатратам, научиться готовить хибернейт (к примеру, апдейтить не все поля в нем можно, но в hello world примерах, конечно, об этом не пишут, надо копать) или писать все на jdbc.
> Оператор нажимает сейв, и объекту ставится старый неактуальный статус. Водила жалуется, что у него пропал взятый заказ.
> Ставить блокировку при открытии карточки заказа?
Открой для себя оптимистичную блокировку. И с прямым sql проблема будет, кстати та же самая.
> Хибернейт апдейтит все поля разом.
Открой для себя удивительный мир dynamic update.
> Перед отправкой объект надо преобразовать из entity формата бд в dto формата клиента. Я делал это через конвертер.
> Т.к. запросов было много, это преобразование кушало очень много памяти.
Это может косвенно свидетельствовать, что у тебя не очень с реляционным дизайном и сущности слишком большие. Но так или иначе, запрос только конкретных колонок никогда не был плохой идеей и orm тут не при чем. Если ты запрашиваешь всю сущность, а нужно тебе треть колонок, то это просто вейстинг памяти, никакой магии тут нет.
> Постоянные запросы сущности по ид. Хуй знает кто их вызывает, и они были в огромном количестве.
Так и не увлекайся запросами сущностей по id. В половине случаев можно сразу апдейтить с допиленным where.
> Как нормально делать?
Персистенс слой дао/репозиториев, сервис, работающий с ним. Остальное работает только с сервисом. Никакого неконтролируемого доступа всего ко всем.
И важно понимать, что orm это инструмент для круда и сохранения графа объектов. Для всего остального есть прямое написание sql (не важно через билдеры или напрямую юзать jdbc). И в реальных высоконагруженных проектах используется и орм, и прямой sql, а не как обычно бывает - начинают юзать орм, нихуя его не понимают, начинают лепить аналитические запросы, хуйню-говно, все тормозит, орут, что орм говно, все запросы переписывают руками и сидят в говне довольные.
Нет, не так.
Все как и всегда зависит от компетентности и отмороженности того, кто принимает решение.
Инструменты выбираются по назначению, под конкретную задачу. Серебрянной пули нет и не было.
веб-фулстек разработчик с 15+ стажем
>для стартапов
Для стартапов язык не так важен.
Важнее краудфандинг через ICO смарт-контрактов на Ethereum.
Гироскутер у тебя есть?
А макбук?
Ближайший кофешоп далеко?
Смузи любишь?
Вот об этом надо думать, а не о языках.
Serverless architectures.
Languageless development.
Вот это вот всё.
Это в тред it-неудачников в воркаче.
Легенды о золотых молотках живут в наших сердцах.
Смотри Spring-потрошитель на ютубе, более чем достаточно
для стартапов на первом этапе очень важна скорость разработки чтобы выкатить что-нибудь в прод как можно раньше. для этого подходит какой-нибудь nodejs и прочие. т.е. для прототипирования. потом при необходимости можно уже переписывать на что-то серьёзное
хуй там плавал. от n+1 можно избавиться только с помощью jpql
>Например : оператор открывает карточку заказа, в это время водитель берет заказ, меняя у него статус. Оператор нажимает сейв, и объекту ставится старый неактуальный статус. Водила жалуется, что у него пропал взятый заказ.
Я или не понял проблему, или ты сделал какую-то хуйню. Разве это не случай optimistic lock. Вводишь версионную колонку и всё. В твоём случае когда оператор нажимает сейв, у него выкинется optimistic lock exception, можно предложить в этом случае обновить данные. Это же базовый сценарий
Нет, не много. Зато много сломали. Жди 11 жаву и уже после её выхода думай о перекате.
У меня аналогично. Жди LTS осенью
Это может быть и случай, когда реально никто ничего одновременно не апдейтит, т.е. lock не нужен, но хибернейт перетирает поля просто потому что может. Спас бы @DynamicUpdate, как тут уже писали.
Jshell завезли для автотестов, и все в общем-то. Половина библиотек на 9 и 10 не работает.
Смартфоны для водил и делфи (молчать) для диспетчеров. И тем и тем отдаю json по http
нет, программа
Я не он, но спрошу - каким хуем здесь замешана транзакция?
Тут или блокировки/версии на уровне БД (как пишут выше), или блокировки на уровне логики приложения.
Выбор зависит от задачи.
Например, блокировки на уровне БД не подходят, если мы не хотим, чтобы набив форму строк на 300 человек вдруг увидел, что не может её сохранить, и должен набить заново. Людям такое не нравится.
Или ты хочешь, чтобы транзакция висела открытой неопределённо долго?
>List<> array; array.add(currentSortArray)
Ты там List<Integer[]> array = new ArrayList<>() наговнякал что ли? о_О
Пиздец у тебя насрано в голове, земля пухом. Читай блядь любой базовый гайд по жабе, ты букваря считай не знаешь.
делфи лучше современной веб-параши, с точки зрения бизнеса. Да и разработки.
Если именно десктоп нужен
>Внезапно, реляционная модель хорошо вписывается в ОО.
Доставь примеры наследования из реляционной модели.
Таблица ссылающаяся на таблицу базовой сущности. Наследуемые поля пишутся в базовую, специфичные для дочернего класса - в новую.
>это решает один написанный маппер
Ну да, MyBatis например. А эта хуйня кривая, которая что-то там без твоего ведома подгружает или сохраняет/удаляет, нахуй не нужна.
>если писать каждый необходимый запрос на голом SQL (или даже на jooqе), не заебусь ли я еще больше, чем от хибернейта
Проблема современных кодеров в том, что они не могут в SQL. Поэтому для них Hibernate кажется чем-то охуенным. А все дело в кривых руках, на самом-то деле.
>Если ты не нахуевертил с конфигом, то запросы будут оптимизироваться, исходя из того, что один большой запрос выгоднее сотни мелких.
Ты, братишка, даже основы баз данных не осилил, поэтому для тебя SQL и реляционная модель - эта сложна. Тебе привычнее и понятнее пердолиться с объектиками. Поэтому ты и возбудился на критику Hibernate. Ну да ладно, земля тебе пухом.
>то это не вина инструмента
Нет ни одной задачи, для которой подходит Hibernate. Следствие --> он не нужен.
>Таблица ссылающаяся на таблицу базовой сущности.
Вот ведь хуйня какая: в реляционной модели эти две таблицы будут разными типами, а в объектной - coercible.
да, только сейчас об ней прочитал.
Но всё-равно это плохое решение: у диспетчеров зарплата зависит от скорости работы. А тут постоянно будет вылетать ошибки и постоянно нужно заново заполнять поля данными, которые они уже забыли.
DynamicUpdate хибернейтовское лучше бы подошло. Тоже только сейчас об нём узнал.
При этом главное - следить, чтобы поля для водилы и для диспа не пересекались.
>Проблема современных кодеров в том, что они не могут в SQL
Если кто-то может в SQL, обязательно ли это значит, что ему нужно, как покорной макаке, соглашаться набивать на нем руками 145 однотипных джойнов и апдейтов? Может ему лучше приберечь свои охуенные знания SQL для чего-то более стоящего вроде развесистых аналитических запросов?
>145 однотипных джойнов и апдейтов?
что за мифы. Лор например написан без хибернейта. Можешь посмотреть, есть ли там 100500 однотипных джойнов
https://github.com/maxcom/lorsource
>что за мифы
Это реалии жирного ынтырпрайза, с которым мне приходилось иметь дело. Для коментов на сайте может быть и не 100500, да.
Но вот возьмем даже этот lorsource. Там около 25 dao, открываем PollDao и видим штук 15 строк типа
private static final String updateMultiselect = "UPDATE polls SET multiselect=? WHERE id=?";
25 умножаем на 15... Уже достаточно работы для SQL-эксперта.
Как минимум большую часть (но не все, да) апдейтов не придется ебашить, будешь вместо этого сеттеры сущностей вызывать. А простые селекты с джойнами писать на criteria сильно приятнее, чем на sql.
>как покорной макаке, соглашаться набивать на нем руками 145 однотипных джойнов и апдейтов?
Про то, что код, особенно однотипный, можно генерировать, ты слышал когда-нибудь?
Попробуй - понравится.
У меня оно только одну строчку с клиента принимает и все
Ничего плохого в дельфи нет.
Если речь идёт о формошлёпстве.
Но, как быть с деплойментом?
Свинг в виде апплета или вебстарта - это несколько другой уровень.
Хотя, если у тебя одна точка, и приложение лежит на сетевой шаре, то похуй, конечно но, всё равно неудобно.
И, в случае java-java, можно использовать Hessian в качестве протокола, а это совсем уже другой уровень.
Для андроида, он вроде-бы, тоже есть, я просто не пишу под андроид.
>Hessian
бинарный проприетарный.
Спасибо, не надо
>Но, как быть с деплойментом?
В ярлыке было прописано автообновление из шары. Не знаю, это виндовая фишечка или дельфовая
>Свинг в виде апплета или вебстарта - это несколько другой уровень.
свинг сыроватый. Я все эти веб-аппликухи, они медленные по сравнению с десктопом. И сыроватые
Ну дык вот мне ORM по мере сил и генерирует. Посоветуешь какие-нибудь еще подходы к генерации SQL?
>бинарный проприетарный.
Опенсорсный. И ему лет триста уже.
Что до бинарности - это плюс, а не минус - он компактный.
У них есть то же самое, но текстовое - Burlap.
Но, он редко нужен.
На самом деле - охуенная вещь.
Ты пишешь код так, как будто никаких веб-сервисов просто нет, и всё локально. Просто вызывешь методы интерфейса сервиса, остальное делает прокси. Асинхронность, естественно, руками делается - SwingWorker etc.
В спринге тоже поддерживается, кстати.
>веб-аппликухи
Свинг это десктоп.
>свинг сыроватый
Лол.
Староватый он, это да.
Но, всяко помоложе дельфи.
Компоненты - JIDE.
Понятно, что ты не будешь переписывать своё дельфи на свинг.
Это я скорее о том, как вообще делаются такие вещи.
Если считать, что все упирается во встроенные в жабу таймзоны, то сравнивай для начала версии jdk/jre; именно на чем запускаешь, а не на чем компилируешь, компиляция тут вообще не при чем.
>Посоветуешь какие-нибудь еще подходы к генерации SQL?
Примерно, как и в ORM - аннотации, потом рефлекшн и генерация SQL и прочего.
Можно находить свойства - геттеры-сеттеры и без аннотаций.
Руками или через Commons BeanUtils (PropertyUtils).
Если у аннотаций retention policy = class, или просто надо работать с class-файлами, то надо использовать что-то типа ObjectWeb ASM (http://asm.ow2.io/) вместо рефлекшн.
Так же можно, например, генерить код интерфейсов на TypeScript (для сериализации Java-объектов в JSON и использовании на клиенте в JS/TS), чтобы были подсказки в IDE, и т.п.
>на пару циферок
Этого достаточно, лол.
Сделай простейший класс, который печатает текущее время. И запусти там и там.
>Примерно, как и в ORM - аннотации, потом рефлекшн и генерация SQL и прочего.
Звучит как написать свой более правильный и легковесный ORM. Тоже вариант наверное.
Я так генерирую xml для iBatis SqlMap.
А также прочее подобное, напр. XSD.
Можно и свой ORM написать, конечно, но, если только для общего развития.
Ещё можно написать тонкий слой поверх JDBC, чтобы не писать весь этот бойлерплейт каждый раз.
С лямбдами это стало вообще интересно.
Я имею в виду создание PreparedStatement, задание параметров, обработку ResultSet, автоматическое закрытие и т.п.
>Ещё можно написать тонкий слой поверх JDBC
>создание PreparedStatement, задание параметров, обработку ResultSet, автоматическое закрытие
Это ты сейчас спринговый JdbcTemplate описал. С этим все понятно, но от написания запросов не спасает.
> но от написания запросов не спасает.
Ну, от этого спасает ORM, лол.
На самом деле, если приложение проектируется с нуля в 2018, если там одна БД, если всё под контролем, то, конечно, имеет смысл использовать ORM, заранее учитывая все его особенности.
Просто не всегда всё так радужно.
Java EE существует уже очень много лет.
Гораздо дольше, чем нормальные ORM или тот же спринг.
Также, бывают легаси БД, параллельно работающие с какой-нибудь хуетой, написанной на дельфи в середие 90-х, и т.п.
Поэтому и DAO на JDBC и iBatis и прочее.
Те, чья молодость пришлась на, те на яве не пишут, те на яве катаются.
Но ведь ORM должны использоваться как раз там, где нет четкой привязки к БД. Сегодня PG, завтра оракл.
Не очень прослеживаю, как соображения про легаси противоречат ORM, ну кроме того, что сами ORM раньше были хуже.
И те, кто кричит, что хибернейт нинужен, они же явно не от того это делают, что на J2EE 1.3 сидят.
Зачем ты продолжаешь кушать кактус Date/Calendar? Есть JodaTime, есть новое апи времени, есть бекпорт новго апи в конце концов.
>Свинг это десктоп.
>
>>свинг сыроватый
>Лол.
>Староватый он, это да.
>Но, всяко помоложе дельфи.
>Компоненты - JIDE.
>
Зачем лезть в джава-онли протокол когда есть куча других, клиент может быть не только на ведре, но и веб, и гейос, почему нельзя просто пользоваться протобафом/жсоном....
Ну ты еще спроси, зачем он glassfish кушает. Явно же не по своей воле.
> только ревизии, или что там, на пару циферок отличаются
http://www.oracle.com/technetwork/java/javase/tzupdater-readme-136440.html
Что конкретно неудобно? Я прямо сейчас делаю курсовой проект с Реактом на клиенте и Спрингом на сервере. И они прекрасно дружат. Не знаю, может, есть какие-то критические неудобства, которые всплывают в настоящих проектах, но я пока ни с чем подобным не сталкивался.
у нас хотели с файрбёрда перейти на постгрес. Но останавливало огромное количество хранимок, которые надо переписывать и как-то тестировать
Был один клиент, настойчиво просил перекатить все на постгрес. Перккотили. В итоге купил столько часов, что хватило бы лет на 5. Вроде бы и похуй, но это ещё с учётом того, что было написано с хибернейтом.
В случае отдельного продукта имеет смысл не делать привязку к конкретной СУБД. У каждого пользователя БД менять не будет, но абстракция позволяет загнать такое ПО большему числу компаний.
Начнём с того, что на джава-бэкенде можно писать сайты на ПХП (Quercus).
И что?
А есть ещё JSF и просто море всякой разной другой хуеты.
Чем это тебя не устраивает?
Есть Grails.
Ещё и jRuby есть (и рельсы тоже), и даже jython + Django, для совсем уж тонких ценителей.
Улавливаешь мысль?
Мартыхан пытается угадывать. Чего только не сделаешь, лишь бы доку читать не пришлось!
>Примерно, как и в ORM - аннотации, потом рефлекшн и генерация SQL и прочего.
>Можно находить свойства - геттеры-сеттеры и без аннотаций.
>Руками или через Commons BeanUtils (PropertyUtils).
А можно не писать велосипеды и использовать орм. Дисциплинированное использование любого вменяемого орм фреймворка даст то, что ты описал без каких-то подводных. Я понимаю, что всегда хочется наговнять своё решение, заточенное под конкретную задачу, но всегда ли это хорошая мысль?
И какой кейс использования джейшелла? Есть же груви. А вообще
> 20!8
> не писать тесты на груви котлине
> 20!8
> не писать все на котлине
Никаким. Это поможет только если изоляция repeatable read, это путь к дедлокам и гробам в лодке с пидором через реку. Правильное решение - дайнемик апдейт и статус заказа вынести в отдельную 1 к 1 сущность (а лучше 1 ко многим, чтобы была история статусов). Водила принял заказ, версия статуса заказа обновилась. Оператор изменил дескрипшн заказа, версия заказа обновилась. А вот если они одновременно изменяют статус заказа - ну тут кому повезет первым, чтобы не было объебанного водителя или оператора.
>>83775
Ты мы не в той ситуации, чтобы торговаться.
>>83813
Так ведь проблема лост апдейтов осталась - два оператора изменят заказ и данные первой транзакции затрутся второй. Ты просто ее под паркет спрятал, чтобы не пересекаться с водилами.
>>83907
Гугли java non blocking io.
>>83921
Обнови tzdata или джаву. Скорее всего на сервере восьмая джава еще до свистоплясок с изменением часовых поясов.
>>84062
Полная глупость.
ast3r`6cionANUSrambleVB8rPUNCTUMr:YYu пишите
Не бомби, папка.
Нет. Джавадок это документация на публичное апи. Приватные поля не должны на него влиять.
Какова вероятность найти работу если я
Прорешал 6 глав конкретной математики.
Осилил Кормена но не решал.
Могу в sql
Знаю паттерны.
Могу в многопоточность. Имутабельность. Асинхронность. Дедлоки. и тд.
Чтение английского без проблем.
Написал ll(1) парсер регулярных выражений.
Велика.
Где живёшь-то? Если в миллионнике, то не парься. Сегодня же начни составлять резюме. Погугли, как его правильно составить, это очень важно. И дерзай. Нечего засиживаться, этим многие страдают, хотя уже готовы к работе джуном.
На Hibernate только ещё глянь
Уважаемые Java господа, реквестирую мнение про автоматизированное тестирование на java, сильный ли зашквар, сложно ли потом перекатиться в разработку?
От чего так? Сильно интересная область или затянет как болото насмерть?
Однозначно DTO.
Подумай, json-поля могут отличаться. Скажем, в базе дата со временем, а в json дата и время это разные поля. Если будет совмещать entity и маппинг json - получится нечитаемая каша
Можно, но не нужно. Джава для десктопа не очень. Лучше использовать GTK и Qt
ну хз, внешне говнокода нет
Она на свинге.
Так мне чтобы на работу устроится нужно опыт получить, так я коммитя в опенсорс хочу его заиметь
Охуительные истории, конечно. Всем похуй на твой джуниорский опыт в опенсорсе. И так, и так будешь джуном. Ну, можешь тратить время впустую, вместо того, чтобы зарабатывать деньги и получать коммерческий опыт, дело твоё.
Джуниором - не надо.
Если есть вышка, знаешь CS (хотябы базовые структуры данных и сложность алгоритмов), можешь на бумажке развернуть односвязный список, и понимаешь чем inner join отличается от outer - пили контакты "мы с тобой свяжемся".
Ах, да! ДС онли и гражданство РФ (требование СБ).
1. Сильно лучше чем ручное.
2. По моему опыту: много народу пыталось, но в итоге никому не удалось. С другой стороны, а зачем? Из QA можно расти в релиз менеджеры, и продукт оунеры. Не говоря уж про началиника отдела QA.
Зачем тестировать на Java? Это ведь неудобно наверно. На питоне же проще будет, не? А если нужна jvm, то на groovy.
Не слушай этого. Джавадок добавляется и на приватные поля/методы (смотри jdk). При генерации документации можно указывать, нужно ли включать приватную инфу, поэтому в документации её нет, но в коде есть.
Официальный туториал, Java Concurrency in Practice, придумай задачки с использованием нескольких потоков.
А гуру нахуй не надо становиться, имхо. Если не используешь повседневно многопоточку, то всё равно забудется. Главное в общем представлять, что происходит и всё.
Я писал несложные вещи на плюсах с использованием MPI, поэтому принцип понимаю, конечно, но как это в жабе работает - хуй знает вообще. Буду читать-писать, спасибо. Про Concurrency in Practice слышал хорошие отзывы.
Блять, я учусь сейчас. Где-то через год-полтора буду искать работу. А это время хочу уделить на развитие.
Эх.. я не из России. Может быть у вас есть какие-то опции удалённо поботрачить.
Тащемта не нужно понимать именно на низком уровне для 95% задач многопоточности. Достаточно понимать что такое потоки, пулы потоков, почему форкджоинпул не годится для io, понимать что такое синхронизация и никогда ее не использовать, прочитать про мониторы, иметь представление как выполняется асинхронный код, в чем разница между блокирующими и неблокирующими серверами, что такое реактивность, что такое treadlocal переменные и причем тут контекст, и уметь использовать CompletableFuture и фреймворки для многопоточности и до кучи корутины в котлине.
Этого достаточно для решения 95% задач. Если же возникает необходимость в низкоуровневой многопоточности, синхронизации, то в большинстве случае это значит, что активно проебывается дизайн и архитектура приложения и пора юзать евент дривен и евенчуал консистенси подходы.
>>85450
Нет, это вполне нормально. Я когда пилил кровавый тырпрайз тоже почти не юзал многопоточность - это за меня делал контейнер сервлетов. Только один раз возникла необходимость в синхронизаци и мониторах, и то я бы сейчас уже сделал по другому.
void YOBA1(){
if(monitor1.lock()){
monitor1.enter();
if(monitor2.lock()){
monitor2.enter();
do();
}
}
}
void YOBA2(){
if(monitor2.lock()){
monitor2.enter();
if(monitor1.lock()){
monitor1.enter();
do();
}
}
}
1. Использовать те же библиотеки. Например есть у тебя хитровыебанный формат, так ты берешь ту же библиотеку и парсишь. Иначе придется еще поискать ее для питона.
2. Проще получить помощь от команды разработки. Мы например помогали писать QA фреймоворк для паралельного запуска тестов.
3. Cами сценарии можно и на кукумбере писать.
>Однозначно
>могут отличаться
Ты, наверное, на каждый класс однозначно заводишь интерфейс, ведь может когда-нибудь понадобиться еще одна реализация.
> Ты, наверное, на каждый класс однозначно заводишь интерфейс
Всегда так делаю с почти каждым сервисом и компонентом с логикой.
Не приходило в голову, что проще потом отрефакторить те 3% случаев, где оно действительно понадобится, чем постоянно захламлять код ненужными сущностями?
Нет. Интерфейсы помогают разграничивать функциональность и позволяют сосредотачиваться только на контрактах, их выполнении и тестировании выполнения.
Сильная связность не нужна.
Ты в реальных проектах вообще работал? Ты не выживешь без DTO в нехеллоуворлдном проекте.
джойны, агрегирование. изучи, что такое индексы. больше особо ничё не надо
Забыл free дописать.
Во-первых, лок есть, а анлока нет.
Во-вторых, где здесь ГАРАНТИРОВАННЫЙ дэдлок? Сначала отработал первый тред, потом - второй.
Мы вам перезвоним.
я Вам вот сейчас честно скажу. что с компанией Epam у Вас теперь в жизни никогда ничего не получится.
>Сильная связность не нужна.
До прямого вызова методов одного сервиса из другого ты, я надеюсь, тоже не опускаешься, ебашишь все на eventах и messageах
Овсяную?
Ну ясен хер, что где-то dto понадобятся. А где-то у меня есть простая entity с тремя полями, и я хочу эти же три поля сейчас отдать наружу в том же виде. Ради какого профита тут заниматься копипастой?
Что для этого используется и можете ли посоветовать хорошую статью или видеоурок, где это объясняется?
По халтуре приходится вручную распознавать одних и тех же людей на разных фотках. Хотелось бы автоматизировать. Чтобы создавалась папка с общими фотками, у нее подпапка с single фотками. И так, например, для 20 человек.
С нуля мне такое, конечно, не сделать. Нашлась опенсорсная программа faint на java по распознаванию лиц 10 летней давности. Разработчик пишет, что ее можно подключить как библиотеку к своему проекту.
https://faint.sourceforge.io/
https://github.com/jeffrafter/faint
Сложность приемлемая для начального уровня или пока не трогать? Какие технологии могут понадобиться? Можно обойтись только java core?
Или есть какой-то другой общеизвестный подход к решению такой задачи?
хотя я беру код отсюда
https://github.com/iluwatar/java-design-patterns/tree/master/facade
потому что после каждого клика кнопки на странице перерендериваются и если один раз найти нужные элементы, записать в список и просто кликать по ним в цикле, то вываливается - element is not attached to page document
Нужна имплементация логгера. Log4j или slf4j
У тебя есть одна entity. И есть rest, soap, ещё какие-нибудь кастомные представления данных. Ты на одну эту entity будешь пихать минимум 3 набора аннотаций, а то и больше, для каждого поля? Ты понимаешь, какая это каша? Завтра добавится вычисляемое поле в soap - всё равно переделывать. Как потом отличить при импорте, например, какие поля нужно заполнять? Если на каждое представление своё DTO, то всё кристально прозрачно становится, и занимает секунды для того, чтобы разобраться в структуре данных.
По поводу 3 полей - ни разу не встречались такие entity. В любом случае, сегодня это 3 поля, а завтра 5, а послезавтра 7. Лучше делать всё сразу нормально и единообразно, чтобы был порядок в коде и в голове.
причина в кривой верстке, решил проблему пропуском кривых страниц
Ну вот я описал конкретную простую ситуацию, а ты в ответ "а вдруг завтра появится soap с вычисляемыми полями". А вдруг не появится? Вдруг я простой круд формошлеплю? Вот когда появится, тогда введу для него dto. А если ничего подобного на горизонте не видно, может все-таки не обязательно удваивать объем сущностей просто на всякий случай?
>А вдруг не появится?
Я потому и спросил про опыт работы. Не бывает такого на реальных проектах. Всегда что-то да появляется, и нужно заранее об этом думать.
>When the DRY principle is applied successfully, a modification of any single element of a system does not require a change in other logically unrelated elements. Additionally, elements that are logically related all change predictably and uniformly, and are thus kept in sync.
HTTP-, SOAP-, Database-представления скорее отнесу к logically unrelated elements
Выше писал, почему представления не подходят под logically related all change predictably and uniformly
Ну и
S R P
R
P
Всё, я устал немного спорить.
да все эти бест-практис противоречат друг другу и меняются каждый год, не принимай близко к сердцу
>Не бывает такого на реальных проектах. Всегда что-то да появляется
Т.е. у тебя ни разу не было такого, что, к примеру, rest-бэкэнд какой-нибудь внутренней админки оставался просто rest-бэкэндом админки?
сходу могу вспомнить поле dateFormat, дата в форматированном виде.
На клиенте почему-то не любят unix datetime
Да я не об этом, а о разных представлениях типа rest и soap. Ладно, все, хер с ним.
Не совсем понял в чем здесь проблема. Ставишь аннотацию для Джексона чтоб превращал в нужный формат и всё.
Да даже если б и пришлось отдельный геттер для этого завести, не особенно это ужасно как по мне. Но тот анон настаивает, что низзя ничего такого делать, потому что вдруг через 5 лет понадобится добавить соап, и тогда для этого соапа будут отдельные dto, а для реста нет, о ужас. Гораздо лучше прямо сейчас начинать копипастить каждое новое поле в +1 место.
Что значит в +1? Нужно же ещё маппер написать entity -> dto и dto -> entity по необходимости. И тестами их покрыть.
Берешь и гуглишь selenium, инфы море. Если что у тестеров свой тред: https://2ch.hk/wrk/res/1207555.html (М)
Видос что бы быстро вьехать:
https://www.youtube.com/watch?v=N8Rr7rVf1RA&index=186&list=PLBoslWMlaSssPFxMtGr6iV-RgnQbXAYH2&t=413s
Использовал мапперы в проде? Полная хуета, на то, чтобы разобраться чё куда мапится куча времени уходит. Пришёл к выводу, что ничего лучше вручную написанного мапперы из стены геттеров и сеттеров нет
> Использовал мапперы в проде?
И в крупных тырпрайзах, и в хипстосервисах.
> Полная хуета, на то, чтобы разобраться чё куда мапится куча времени уходит.
Ты просто тупой.
> ничего лучше вручную написанного мапперы из стены геттеров и сеттеров нет
Ебать ты дегенератище. Мапперы еще ладно, не все используют хорошее пока, но в 20!8 году не использовать генерала Де`Ломбока это или критическое повреждение головного мозга, или максимальная закостенелость, что в принципе то же самое. Небось еще на седьмой джаве пишешь. В любом случае, ты не стоишь и минуты моего времени.
Пошел нахуй.
чёта не понял при чём тут ломбок, он же генерит сеттеры с геттерами
Как там ломбок на актуальной версии жабы? Когда я последний раз проверял, был никак.
И еще вопрос - можно ли сразу учиться работать с анотациями, минуя xml? Мне например больше нравится грейдл и конфигурация через аннотации/пропертис. Или это от проекта зависит?
jdbc
>можно ли сразу учиться работать с анотациями, минуя xml
Можно, но не нужно. После xml с аннотациями разобраться легко, но неизвестно, насколько древние технологии будут использоваться там, куда ты устришься на работу.
Иди нахуй, клоун блять.
Я же сказал про хибернейт и спросил про то какие еще есть ключевые технологии, о которых ньюфаг может и не знать, учитывая зоопарк технологий/фреймворков джавы.
Но нет, нужно спиздануть про jdbc.
Ты чё развыёбывался, дурачок? Всё он правильно тебе сказал. В идеале нужно потыкать и jdbc, и hibernate, несмотря на то, что в большинстве проектов используется orm.
Где я выебываюсь, даун? Он мне предлагает потыкаться в jdbc, когда я спрашиваю про ключевые технологии и практики? В таком случае тоже иди нахуй.
Одно дело сказать "начни с jdbc и потом то и то", другое просто ляпнуть не к месте про jdbc, когда СПРАШИВАЛИ О ДРУГОМ ВООБЩЕ. Вы вообще отбитые какие то блять, спрашиваешь их про технологии, так они выебываются тем что в jdbc потыкаться надо.
Сам съеби, говно. Может посоветуешь мне еще про модель OSI почитать? Ну а хуле, так же релейтед к моему вопросу как и JDBC
Ты смешной))))
Да там особо не по чему и туториал делать. Посмотри log4j, буквально час-два потрать и всё. В пет проекте нахуй не надо какое-то логирование прикручивать
https://docs.oracle.com/javase/7/docs/api/java/awt/Toolkit.html
Чтобы было.
Есть https://github.com/oracle/graal JIT-конпелятор написанный на жаве. Но он всё ещё экспериментальных, хотя начиная с Java 10 его уже можно использовать, правда только на 64-битных Linux и macOS.
Си больше подходит для всякой низкоуровневой хрени, плюс быстрее. У питона на нем целые библиотеки
C o n d u c t
Потому что если в классе определен хоть один конструктор, конструктор по умолчанию не генерируется
Потому что спецификация
Ещё одна возможность превратить код в говно, потому что мало кто будет пользоваться им дисциплинированно.
Кстати, на днях грааль вышел 1.0 RC1. Так что он уже вполне стабилен. А твитор, вообще его больше года юзает.
Т.е. если приложуха чисто на джава как раньше, то юзаю JVM по-старому, а если хочу написать приложуху на джава + питон + js. то спокойно юзаю GraalVM? Зачем это может понадобиться не очень понимаю всё равно
На ассемблере пиши, поехавший. Я регулярно пишу на котлине - и с валами и варами код понятный. А с другим добром котлина так и еще лучше и читаемее.
>>86548
Нет. Граальвм состоит еще из другой дрисни, но по факту важен только конпелятор JVM говнеца.
И этот самый конпелятор новый написали, потому стоимость поддержки и запила новых фич на C1 и С2 превзошла всякие пределы - для того, чтобы там можно было запиливать фичи, абстрактному разработчику нужно год-два медитировать чисто над исходниками, настолько все сложно и такполучилось.
Поэтому решили хватит это терпеть и запилили грааль, который написан на нормальной джаве и который легко поддерживать и пилить новые фичи. В процессе запила сразу оптимизировали многие места и числодробить стало намного веселее.
А компилировать JS, го, пифон под граальвм не нужно.
А меня больше интересует AOT-конпеляция. Теперь можно будет распространять приложухи без рантайм-дрисни? Учитывая, что всё равно у почти каждого жава-приложения свой собственный рантайм на котором всё проверено, то эта фича была бы довольно удобна.
Полный AOT без JRE, это только Excelsior JET.
Все остальное только с JRE. В JRE будет встроенный AOT для ускорения старта, но не более.
> А я даже модули ещё не курил.
Это которые жигсо? Их много кто ещё не курил. Если твоя прога использует какую-нибудь стороннюю библиотеку могу дать 100% гарантию, что полноценно всё это работать не будет. Вот баттхёрт одного из перекатывальщиков: https://habr.com/post/354114/
А жаль. "Статическая линковка" стандартной библиотеки была бы суперской фичей вместе с AOT.
Надеюсь, что в LTS починят. А то кучу времени на это убили, обидно. И я не очень понимаю, как это всё сочетается с модулями maven/gradle. Ладно, ждём LTS
> Надеюсь, что в LTS починят.
Там не жаву чинить надо, а авторам библиотек перекатываться в модульность. Встаёт очевидный вопрос: а зачем, если и так (почти) всё работает. Впрочем жигсо умудрился сломать и простые jar'ы из-за чего куча библиотек перестала работать с девятой жавой и выше, и это проблема посерьёзней.
Поясни в двух словах в доходчивом двощерском стиле нахуй всралась AOT-конпеляция. У меня так руки никогда не доходили поинтересоваться.
>>86559
>>86563
Потому что жигсо нахуй не всрался. Его мучительно долго рожали, отодвигали из-за него релиз девятой джавы, наконец высрали ублюдка и так до сих пор в массе никто и не понял нахуй он всрался вообще.
Возможность опубличивать только публичное апи толком не нужно - для чисто интернал хуйни всегда есть package level, а если нужно в нескольких пакетах, то в джавадоке написать for internal usage и на все проблемы, связанные с использованием непубличного апи отвечать "ди нахуй, пидрбля".
Возможность хотсвапа модулей тоже толком не нужна - в проде она нахуй не нужна, бо никто не держит единственные серверы и давно уже изборетен АИБ деплоймент, а для девелопа всегда есть джававосставший. Да и по чесноку в тот момент когда монолит уже трещит по швам его не в модульный монолит надо перепиливать, а распиливать на микросервисы.
А для всех остальных задач модульности есть гредл/мавен сабмодули.
Для тех же случаев, когда модульность на уровне джарников необходима, там сложной десктопной херни (хотя тут можно поспорить), никто не отменял osgi. Смотрел краем глаза на Джейпоинте доклады про модули, включая той жирноватой немецкой тни, так и не увидел юзкейов нормальных.
По факту получилось, что рожали-рожали, высрали наконец, коммьюнити посмотрело на получившегося выродка и спрашивает "и че?". И вот это "и че" в воздухе длится до сих пор. Это не говоря о том, что рождение жигсо сломало вообще.
> Поясни в двух словах в доходчивом двощерском стиле нахуй всралась AOT-конпеляция. У меня так руки никогда не доходили поинтересоваться.
Ну если без "статической линковки" (я не знаю как объяснить это в java-терминах), то действительно, особо и нинужно. Просто удобно было бы отказаться от JRE вообще и распространять самодостаточный бинарник.
Я AOT в .NET-приложениях использовал только в десктопе и только для ускорения запуска. И стоит заметить, ускорение действительно было. Запуск крупного приложения, написанное с использованием WPF + контролы от telerik ускорился с полутора минут до десятка секунд.
А вот на сервере (где жава обычно и живёт) я с этим никогда не заморачивался, наверное там оно и нинужно.
@PostConstruct
private void initGenerator() {
Generator.initialize(taskExecutor); }
Вроде все работает как нужно, но как только пытаюсь завершить приложение - вылетает InterruptedException. У спрингбутовского TaskExecutora нет даже метода shutdown. Нагуглил, что нужно в аннотации добавить destroyMethod = "shutdown" (этот метод часть магии или нужно самому писать?). В общем не могу сообразить, выручайте, анончики
Хуйня какая-то. Джава для десктопа вообще не оче, а джарник ты запускаешь в докере или экзешник просто-таки глубоко насрать, лишь бы работало. Хотя с экзешником в докере это да, кхм :3
> Просто удобно было бы отказаться от JRE вообще и распространять самодостаточный бинарник.
Ну тащемта в пределах graalvm была какая-то дрисня, которая вроде позволяла без костылей типа запакованного в экзешник джарника и jre собирать в экзешники приложухи, ты о об этом говоришь. Помнил, но забыл.
Надо будет все-таки не полениться и прочитать про AOT-дрисню.
Не лезь в многопоточность по нубству, она тебя сожрет.
> вылетает InterruptedException
Открой джавадок этого класса и внимательно прочитай первое предложение, разбери его по частям и сделай соотвествующие выводы для себя.
С докером действительно проблем не будет. Просто было бы удобней чтобы сразу бинарник был со всеми библиотеками и не надо было ничего больше настраивать. Опять таки все равно у каждого приложения свой собственный рантайм.
С дивана вижу только бесписечный запуск десктопных приложений под винду. Писать десктоп на джаве не оч, как уже писал - то ли дело на шарпе или заговниться электроном на js. И вообще, талостые клиенты нинужны.
Я десктоп на жаве не пишу. Пытался вкатиться в JavaFX, но вышла хуйня. Qt куда лучше, даже несмотря на привкус C++. Жалко, что связка Qt+Java сдохла и вместо этого продвигают Qt+Python как альтернативу плюсам.
> Excelsior JET
Ну, поставил свой небольшой pet-project на котлине + spring конпелироваться. Через пару часов посмотрю что получится.
Итак, всё сконпелировалося. Вышло 181Мб (при этом само приложение занимает 74Мб, всё остальное опять таки рантайм). FatJar занимает около 40Мб.
Хотя прочитал https://www.graalvm.org/docs/reference-manual/aot-compilation/
Там написано:
> GraalVM allows you to compile your programs ahead-of-time into a native executable. The resulting program does not run on the Java HotSpot VM, but uses necessary components like memory management, thread scheduling from a different implementation of a virtual machine, called Substrate VM. Substrate VM is written in Java and compiled into the native executable. The resulting program has faster startup time and lower runtime memory overhead compared to a Java VM.
Так что да, это полноценная AOT-конпеляция. Вместо HotSpot используется Substrate VM, который правда не поддерживает некоторые фичи жавы и позволяет делать статически слинкованные бинарники.
Т.е. по сравнению с простой джаркой у тебя размер вырос более чем в 4 раза. понятно, что сейчас на такие мелочи обычно забивают
Но надо понимать другое, ты лишаешься оптимизации по профилю исполнения. Для десктоп приложений это коночно не критично, но для высоконагруженного сервера - критично.
> ты лишаешься оптимизации по профилю исполнения.
У Excelsior JET есть PGO, правда профиль придётся делать заранее самому.
А мне откуда знать? А его только сегодня поставил. Да и лучше уж грааль подожду. Он хоть бесплатный.
А вообще, у них же на сайте написано: https://www.excelsiorjet.com/profile-guided-optimization
Это копия, сохраненная 4 июля 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.