• Как сохранялось состояние фрагментов до появления ViewModel и LiveData?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Так же, как это делается сейчас там, где не используют эти компоненты.
    onSaveInstanceState/onRestoreInstanceState +Icepick, retain fragment, неубивание активити при смене конфигурации + onConfigurationChanged, замена фрагментов на контроллеры(Conductor).
    Ответ написан
  • Стоит ли изучать Kotlin, если не знаешь Java?

    @xez
    Senior Junior Roo
    Является или не является - покажет время.
    Kotlin - не первый язык (и, наверное, не последний), который использует jvm (Пруф: https://ru.wikipedia.org/wiki/Список_языков_JVM) и не один из них не "замена", хотя и занимает определенную нишу.
    Стоит или не стоит - на этот вопрос никто не ответит. Это вопрос очень личный. Смотря для чего? Чтобы устроиться на работу? Начать свой проект? Размять мозги?
    Ответ написан
  • Нормально ли хранить состояние selected в экземпляре элемента RecyclerView?

    Beshere
    @Beshere
    Инженер-программист
    Это зря. Просто заведи переменную selected и храни там номер в листе или хоть ссылку на сам объект.
    Ответ написан
  • Нормально ли хранить состояние selected в экземпляре элемента RecyclerView?

    @MaxDgd
    android dev
    "Я решил хранить флаг selected в классе, который представляет объект" - what kind of object: data or ViewHolder.
    If data - it's acceptable, if ViewHolder - no (it's a way to bugs)
    Ответ написан
  • Где найти свежие туториалы разработки под Android?

    agent10
    @agent10
    Software Engineer
    Никто не застрахован от ошибок. И гугл не исключение.
    Что можете сделать вы:
    1) Напишите об этом в баг трекер по Студии. Возможно это пофиксят.
    2) Копните ещё глубже и сделайте правильно - для вас практика + опыт :)
    3) Вы нигде не найдёте свежих туториалов вообще по всем темам. Заведите блог и пишите туториалы по нужным темам сами) Так сказать "От новичка - новичкам"
    Ответ написан
  • Почему openjfx не входит в состав openjdk?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Идёт процесс модуляризации стандартной библиотеки. Чтобы в будущем программисты могли поставлять с приложением компактную версию виртуальной машины с минимально необходимым набором библиотек. В рамках этого процесса JavaFX вынесли в отдельный модуль. Так же, как например JAXB - средства для работы с XML и JSON. В одной из следующих версий в отдельный модуль вынесут и Swing. До Java11 модуль JavaFX оставался в составе стандартной библиотеки и входил в OpenJDK, после вынесен в отдельный SDK. Необходимые библиотеки можно получить в виде зависимостей:

    Maven
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx.controls</artifactId>
            <version>12.0.0</version>
        </dependency>
    </dependencies>
    Gradle
    dependencies {
        compile 'org.openjfx:javafx.controls:12.0.0'
    }

    Или SDK можно скачать здесь и подключить модули вручную:
    javac --module-path "C:\Program Files\Java\javafx-sdk-12\lib" --add-modules=javafx.controls Example.java
    java --module-path "C:\Program Files\Java\javafx-sdk-12\lib" --add-modules=javafx.controls Example
    Ответ написан
  • Java теперь на платной основе?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    5c36ceb55373a271424607.png
    Язык Java и виртуальная машина HotSpot - это open source. Есть абсолютно бесплатный OpenJDK в который контрибьютят множество других компаний, кроме Oracle - от небольших типа Excelsior JET до гигантов типа IBM. Oracle JDK собирается из исходного кода Open JDK. Они полностью идентичны. Деньги Oracle берёт за поддержку собственной сборки. Так же, как у Red Hat есть платная поддержка бесплатного Линукса. Если вам поддержка не нужна, используйте одну из множества бесплатных сборок OpenJDK и живите спокойно. Если вы компания класса MailRu Group, предоставляющая высоконагруженные сервисы 330 миллионам пользователей, и ваши специалисты каждую неделю находят баг в виртуальной машине, лучше использовать платный Oracle JDK.
    Ответ написан
  • Как разрабатывать графическое приложение на java?

    @azerphoenix
    но создание кнопок, текстовых полей, размеры окна я делал в графическом окружении. Неужели в Java нужно все элементы прописывать вручную?


    Посмотрите в стороны JavaFX. А для визуального проектирования - Scene Builder
    https://gluonhq.com/products/scene-builder/

    Прекрасно интегрируется с Intellij IDEA
    Ответ написан
  • Что нужно изучать начинающему Android программисту помимо языка программирования?

    @Pardych
    Котлин. Порог входа меньше, язык интереснее. Сейчас он рекомендуется по дефолту для дроида. В противовес предыдущему комментарию - ЗАЦИКЛИВАЙСЯ на программировании. Я зацикливался. Как результат уже 15 лет я с этим живу, из них 10 удаленно, но на окладе или двух сразу. 8 из них кстати на андроид. Очень классная по множеству причин платформа. Очень классные специалисты и культура разработки. Не игнорируй математику, а конкретно вычислительные методы и дискретку. Относительно мышления - оно нарабатывается изучением сначала алгоритмов и структур данных, а потом архитектурных шаблонов (паттернов проектирования). Переболев всеми детскими болезнями начинающего разработчика, а так же получив опыт можно стать неплохим инженером, у которого нет проблем с решением задач бизнеса за деньги (неплохие). Вопрос этого ли тебе надо. Несмотря на неплохой доход это не путь в миллионеры, а стиль жизни который не всякому по нутру. Многое решается усидчивостью. Даже при наличии таланта придется много стараться чтобы не болтаться в рядах посредственных говнокодеров. Если да, то начни с реального учебного проекта, а потом подтягивай теорию. Нет ничего лучше чем сделать что-то с нуля в самом начале. Ты получаешь реальный опыт, знакомишься с инструментами и примериваешь на себя ощущения - того от ты ждал, есть ли отдача.
    Ответ написан
  • Что нужно изучать начинающему Android программисту помимо языка программирования?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Я начинал примерно в твоём возрасте, у меня не было интернета, и был Турбо Паскаль 7.0(+ книжка по нему), а чуть позже - Делфи.

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

    Изучив маломальские основы, иди на codeforces 3 дивизион, и начинай решать задачки. Также можно решать hackerrank. Для развлечения - codewars, codefighters(не знаю, живы ли они ещё).

    Если учишься в школе - постарайся поучаствовать в олимпиадах, но без фанатизма, цели стать золотым призером мировой олимпиады у тебя нет. Я обычно брал 1-2 места на районе и в городе-миллионнике и на этом всё. Цель тут - порешать задачки в стрессовой ситуации, набить руку, и понять, чего ты стоишь.
    К 10-11 классу ты должен легко писать типовые школьные задачки.

    Если в твоём городе есть Яндекс Лицей, и ты проходишь по возрасту, постарайся туда попасть.

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

    После школы поступай в хороший ВУЗ, на факультет, связанный с программированием. Тут я традиционно рекомендую ВМК МГУ, ФПМК ТГУ, Бауманку, МФТИ, СПбГУ, ИТМО. Да, сейчас множество людей говорят, что ВУЗ не нужен. Но это очень зависит от ВУЗа. Шарага, где учат пхп и интернет-магазин в качестве курсовой, действительно не нужна. Хороший ВУЗ даёт базу, учит думать, потом можно говорить с коллегами на одном языке. В нашей команде я не знаю никого, кто не закончил бы ВУЗ. Ещё даёт попробовать разные языки программирования. Я изучал примерно 7-8 языков за 5 лет. Да, использую из них 2-3. Но уже на работе, впервые увидев php или Ruby, сразу сделать в нём правки, и увидеть, что код написан плохо - бесценно.

    Не называй себя начинающим андроид разработчиком! Ты ещё ничего не пробовал! Я понял, что хочу заниматься андроидом, когда уже лет 5-6 программировал. Ты можешь понять, что хочешь заниматься чем-то другим.

    Прими как факт, что в ближайшие 3-4 год тебе не на чем заработать. Ну если только не клепать интернет-магазины за копейки, но это путь в никуда.
    Ответ написан
  • Как работает хеш-таблица / ассоциативный массив на пальцах?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    в данном случае хэш-функция возвращает int, а не строку. Цель хэш-функции превратить объект, используя его содержимое, в целочисленное значение - это и будет индекс для массива. Эту хэш-функцию надо грамотно написать, чтобы было минимум коллизий и для этого есть несколько базовых рекомендаций.
    Внутри хэшмэп устроен так, что у него есть массив списков. То есть, по индексу, который мы вычислили с помощью хэш-кода, мы из массива по этому индексу (вот он, О(1)) забираем список (список - как раз и есть те самые коллизии и чем их меньше, тем короче будет список), в котором хранятся значения и забираем/добавляем нужное значение.
    И тут есть замечания: если хэшкод всегда возвращает нам одно и то же число, то хэшмэп вырождается в список - все значения по любому из ключей будут храниться в списке, доступном по одному-единственному индексу.
    В идеале хэшкод должен возвращать уникальное число для каждого объекта (но всегда одно и то же для объекта с таким же содержимым, ключом)

    Общее понимание и прекрасное объяснение:
    https://en.wikipedia.org/wiki/Hash_function
    Функция для PHP:
    https://php.ru/manual/function.spl-object-hash.html
    Объяснение, почему нужно использовать простые числа на примере рекомендаций из книги "Effective Java" (объяснение есть и в википедии):
    https://computinglife.wordpress.com/2008/11/20/why...
    https://stackoverflow.com/questions/3613102/why-us...
    https://medium.com/@biratkirat/learning-effective-...
    Ответ написан
  • Adnroid, MVP. Как определять, включать метод в интерфейс или нет?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Имхо, всё это жуткий отстой.
    View должно иметь методы только по показу данных. navigateToHome к ним не относится, это должен быть отдельный объект Router, которого нет в MVP.
    View не должно иметь ссылку на Presenter и дергать из него какие-то методы.
    Во View не должно быть бизнес-логики.
    Presenter должен иметь ссылку на View.
    Из View должны торчать наружу события(rx observable или коллбеки, например), на которые подписывается Presenter.
    У Presenter'a должно быть два метода для связывания его с View: bind(View), unbind(View).
    Fragment или Activity не должны быть ни View, ни Presenter'ом, ни Model. Они - клей, системные механизмы для связывания и поддержания стека экранов. Они каким-либо создают или получают через DI инстансы View и Presenter, и cвязывают их при помощи bind/unbind.

    Таким образом, методов validate не будет ни в одном интерфейсе, и ни в одной реализации(если только это не приватные методы реализации, конечно).

    Упрощенно как-то так
    interface LoginView {
        @NonNull Observable<String> names();
        @NonNull Observable<String> passwords();
    
        void showError(@NonNull String error);
    }
    
    interface LoginPresenter {
        void bind(@NonNull LoginView view);
        void unbind(@NonNull LoginView view);
    }
    
    interface Router {
         void navigateToHome();
    }
    
    class LoginPresenterImpl implements LoginPresenter {
    
         @Inject
         LoginPresenterImpl(router: Router){...}
    
        private CompositeDisposable disposables = new CompositeDisposable();
        @Override
        void bind(@NonNull LoginView view) {
            disposable.add(
                Observable.combineLatest(view.names(), view.passwords(), (name, password) -> validate(name, password))
                      .doOnNext(validated -> {if(!validated) view.showError("invalid login")}
                      .filter(it -> it)
                      .subscribe(it -> router.navigateToHome())
            );
        }
    
        @Override
        void unbind(@NonNull LoginView view) {
            disposables.clear();
        }
    }
    
    class Fragment {
        @Injecte
        LoginPresenter presenter;
        @Inject 
        LoginView view;
        
         onViewCreated() {
           presenter.bind(view) 
        }
    
       onDestroyView() {
           presenter.unbind(view);
        }
    }
    Ответ написан
  • Как Java программисту подшутить над C++ программистом?

    afiskon
    @afiskon
    - Зачем C++ программист перешел на другую сторону улицы?
    - Зачем?
    - Чтобы собрать мусор! АААААХАХАХХА!

    - Тук-тук. C++ ПРОГРАММИСТ!
    - Кто там?

    Ну и далее по шаблонам....
    Ответ написан
  • Как Java программисту подшутить над C++ программистом?

    OnYourLips
    @OnYourLips
    Не надо над ним шутить, у него и лоб весь в синяках от ударов граблями.
    Ответ написан
  • Является ли хорошей практикой делать интерфейсы даже тогда, когда класс не планируется заменять?

    @kttotto
    все, что .NET
    Нет, не надо. Не нужно усложнят проект там где это не требуется.
    Есть правило первой пули: сначала Вы пишите максимально просто и только когда приходят первые изменения, которые требуют абстракции, тогда только Вы ее выделяете.
    Ответ написан
  • Можно ли программировать просто ради кода?

    @stratosmi
    Скорее всего так:
    То, что вы считаете достижением и на чем хотите зарабатывать - те задачки рядовой программист щелкает каждый день по десятку.
    Следовательно, ваше умение никому не нужно.
    Как правильно сказал Saboteur - чтобы зарабатывать на этом нужно уметь придумывать вещи на пару порядков сложнее.
    Чистая теория если вас интересует - то это такая наука "математика".
    Ответ написан
  • Можно ли программировать просто ради кода?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    build engineer
    а тем, что тебе просто интересно придумывать алгоритмы к задачкам, интерфейс которых не выходит за рамки командной строки?

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

    Чтобы писать алгоритмы и при этом не программировать, нужно писать очень крутые алгоритмы.

    Например напишите сортировку, которая будет работать быстрее, чем например quicksort (https://ru.wikipedia.org/wiki/%D0%91%D1%8B%D1%81%D...

    Напишите алгоритм архивации, который сожмет лучше чем хотя бы дефолтный 7zip, да хотя бы лучше чем дефолтный zip.

    Напишите свою реализацию криптования sha2

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