Чи потрібно мати справу з ситуацією, коли приватні методи викликаються через рефлексію?


12

Створюючи бібліотеку, чи повинен я переконатися, що приватні методи повинні працювати так, як очікувалося, коли їх викликають не інші методи того ж класу, а інша бібліотека через рефлексію ?

Наприклад, якщо приватний метод private DoSomething(int number)очікує, що:

  • number - це додатне ненульове ціле число, і:
  • приватна змінна string abcне є нульовою та не порожньою рядком,

і повністю, потворне не вдається, якщо ці дві умови не збігаються, чи повинен я поводитися з цими відмовами, навіть якщо я знаю, що всі методи в класі завжди будуть призначати не порожнє значення abcперед викликом DoSomething, і передавати цьому додатне ненульове ціле число метод?

Іншими словами, чи код, який не захищений від небезпечних дзвінків через відображення, може вважатися кодом низької якості , або він належить тому, хто телефонує, що використовує рефлексію, щоб гарантувати, що дзвінок нічого не порушує?

Примітка: моє запитання стосується лише стандартного набору бібліотек. Це не охоплює код, який повинен бути дуже захищеним (тобто коли хтось може зацікавитись, використовуючи відображення, щоб змусити його поводитись несподівано або зірватися).


¹ Оскільки клас правильно задокументований, оскільки є достатньо одиничних тестів, щоб бути впевненим, що будь-який інший розробник не порушить цей метод тощо.


чи зможуть похідні класи викликати приватні методи?
eenone

Відповіді:


16

Позначивши свій метод приватним, ви встановили свої наміри та договір. Використовуючи роздуми, клієнтський код може вибрати розірвання цього договору, і, отже, доведеться нести наслідки. Те ж саме відбувається з протоколами, для того, щоб діяти правила роботи, або погані речі будуть відбуватися.

Така ж проблема може виникнути і з іншими мовами, такими як C ++, де я бачив подібні речі

#define private public

Підсумовуючи це - ви НЕ зобов’язані вирішувати ці ситуації, абонент повинен краще знати.


3
Я бачив, як люди кидають заняття (неподписаний знак *) і записують безпосередньо в зсув пам'яті змінної члена, яку вони хочуть змінити. Мої очі кровоточили.
Шон Д.

6
Додам, що захистити свій клас від небезпечного привілейованого коду по суті неможливо . Якщо вам якимось чином вдасться захистити себе від неналежного використання рефлексії, то хтось знайде інший спосіб зруйнувати ваш день, можливо, просто перезаписавши вашу пам'ять процесу безпосередньо. Оборонне кодування зрештою досягає точки зменшення віддачі, і відображення проходить повз цю точку.
Aaronaught

5

Якщо хтось використовує роздуми, щоб викликати ваші приватні методи, це знак того, що хтось робить щось не так. Або він використовує код так, як він не був розроблений, або ви приховуєте занадто багато внутрішніх розробок та скидання API.

Але це здається, що ти ще навіть не на тому етапі, і просто намагаєшся переважати. Тож моя думка така: не хвилюйся. Приватний метод слід вважати поза межами; якщо хтось навмисно порушує ці межі, то це їхня проблема, якщо щось підірветься.


0

Що ж, завжди корисно перевірити не локальні змінні, перш ніж використовувати їх, але крім цього я б не переймався цим. Як говорили інші, ви створили свої наміри, зробивши метод в першу чергу приватним; той, хто телефонує за межами вашого класу, має нульові гарантії. Під час роботи в Java я навіть не ставлю коментарі javadoc до своїх приватних методів, тому що я не хочу, щоб інші розробники навіть знали, що вони є.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.