• Смысл сокрытия, когда есть рефлексия?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Затем, что модификаторами доступа ты описываешь интерфейс (в смысле API) класса. То, что можно дёргать снаружи, публичное. То, что могут дергать наследники - протектед. То, что никто не должен знать - приватное. Если кто-то лезет в приватные поля рефлексией - ССЗБ, ты на это закладываться не должен, и поведение не гарантируешь.
    Ты имеешь право в любой момент менять реализацию и поведение приватных полей и методов. Публичный интерфейс должен сохраняться.
    Короче, это всё как декларация намерений.
    Ответ написан
    4 комментария
  • Смысл сокрытия, когда есть рефлексия?

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    age > 0

    А вы в курсе что возраст детей, в первый год жизни, меньше одного года?

    age < 100

    И, к стати, люди, иногда (хоть и редко), живут больше 99 лет.

    По сабжу давайте я приведу понятный пример с автомобилем.

    У машины есть три (или две) педали. Это ваши сетеры, которые устанавливают уровень ускорения и степень торможения. А еще спидометр, тахометр, датчик температуры и топлива в качестве гетера.
    Перефразируя ваш вопрос - нахрена машине педали, если я могу залезть под капот и вручную дергать приводы клапанов/заслонок и т.п. (при этом легко ломая логику работы педалей), и зачем мне все эти спидометры, если можно визуально посмотреть как быстро вращается валы/колеса?

    Ответ:
    Удобно, вы точно знаете как оно работает, производитель может поменять начинку (например заменить всякую механику и пневматику компьютером и электроприводами), а педалей как было три (или две) так и осталось, их функционал не изменился. Более того, в аналогичных изделиях другого производителя внезапно тот же API -педали и спидометр, хотя под капотом вообще может оказаться электромобиль.

    В общем логика такова:
    "Вот вам функции, за них и дергайте... а если лезете под капот... вы знаете что делаете и/или ССЗБ, а у нас лапки.

    Пожалуйста, максимально просто. Я еще совсем новичок.

    В любом случае - если вы не знаете (и/или не можете объяснить хотя бы резиновой уточке) зачем вам нужна рефлексия - она вам 100% не нужна.
    Ответ написан
    Комментировать
  • Смысл сокрытия, когда есть рефлексия?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Сокрытие в целом и модификаторы доступа в частности - это не про защиту от злонамеренных хакеров, взламывающих ваш код. Модификаторы доступа нужны для предотвращения непреднамеренно ошибочного использования объектов. В больших системах бывает сложно уследить, что один объект из сотен, в одном из тысяч возможных состояний программы не нарушает инварианты другого объекта. Весь ООП нужен для снижения сложности кода.

    А рефлексия - это чёрных ход в JVM. Рефлексивный код медленный и небезопасный. Он наоборот увеличивает сложность и сводит к нулю половину достоинств языка. Применять рефлексию допустимо только при разработке инструментальных средств и фреймворков. И даже при этом стоит стремиться сократить обращение к ней.

    Образно говоря, вам необязательно пить и есть, питаться вы можете и через капельницу. Но это не значит, что вам не нужны зубы и 5 метров кишечника.
    Ответ написан
    1 комментарий
  • Использование интерфейсов в Java?

    jamakasi666
    @jamakasi666 Куратор тега Java
    Просто IT'шник.
    Автору. Вы взяли какой то очень невнятный пример себе. Образно говоря интерфейс это абстракция.
    К примеру у вас есть некая игра. В игре есть транспорт. Вы задаетесь вопросом а какбы сделать так что бы не знать о том что именно это за транспорт но при этом уверенно использовать его.
    1) Вы смотрите все свои классы: легковая машина, автобус, самолет, катер, велосипед.
    2) У всех классов транспорта можно выделить общие черты. Они могут ехать вперед\назад, рулить влево\вправо, подать сигнал и т.д.
    3) Описываете интерфейс с этими выделенными общими методами. Например
    interface Transport{
       void gazuem();
       void tormozim();
       void signalim();
    ...
    }

    4) Теперь настало время реализовать этот интерфейс. Пример:
    public class Avtobus implements Transport{    
        public void gazuem() {
            //реализация особенности как едет автобус
        }
        public void signalim() {
            //тут просто школьный Фа-Фа
        }
    }
    //Велосипед
    public class Velosiped implements Transport{    
        public void gazuem() {
            //реализация особенности как будете крутить педали
        }
        public void signalim() {
            //тут колокольчиком Дзинь-Дзинь
        }
    }
    //Остальные реализации

    5) Абстрагируемся в коде от реализаций конкретных видов транспорта, т.е. работаем с ними как с черной коробкой. Например:

    Transport velik = new Velosiped();
    Transport avtobus = new Avtobus();
    ...
    Transport samolet = new Samolet();
    
    ...
    И гдето , например, все виды транспорта попали в коллапс и надо резко посигналить.
    velik.signalim(); //Дзинь дзинь
    avtobus.signalim(); // Фа-Фа
    samolet.signalim();// А тут звуков не будет но вам до лампочки и никаких ошибок не будет
    ...
    //Дальше, например, у игрока есть метод использовать.
    //Вам не нужно знать какой именно тип транспорта перед ним, вы просто делаете следующее:
    class Player{
    ...
    public void use(Object someObject){
              if(someObject instanceof Transport){
                    //Сюда попадет абсолютно любой тип транспорта
                    ((Transport)someObject).sadimsya(); //Что там внутри и как оно работает вас уже не интересует
              }
    }
    ...
    }

    Вот в целом как то так это выглядит.
    Ответ написан