Czy muszę radzić sobie z sytuacją, w której metody prywatne są wywoływane poprzez refleksję?

12

Czy podczas tworzenia biblioteki muszę upewnić się, że metody prywatne muszą działać zgodnie z oczekiwaniami, jeśli nie zostaną wywołane przez inne metody tej samej klasy, ale przez inną bibliotekę poprzez odbicie ?

Na przykład, jeśli metoda prywatna private DoSomething(int number)oczekuje, że:

  • number jest dodatnią niezerową liczbą całkowitą i:
  • zmienna prywatna string abcnie ma wartości null i nie jest pustym ciągiem,

i całkowicie, brzydka nie powiedzie, jeśli te dwa warunki nie są dopasowane, muszą sobie radzić te awarie nawet jeśli wiem, że wszystkie metody w klasie będzie always¹ przypisać niepusty wartość abcprzed wywołaniem DoSomethingi przekazać pozytywną niezerową liczbę całkowitą, to metoda?

Innymi słowy, czy kod, który nie jest chroniony przed niebezpiecznymi połączeniami poprzez odbicie, można uznać za kod niskiej jakości , czy należy do dzwoniącego, który używa odbicia, aby upewnić się, że połączenie niczego nie przerywa?

Uwaga: moje pytanie obejmuje tylko standardowy zestaw bibliotek. Nie obejmuje to kodu, który musi być bardzo bezpieczny (tj. Gdy ktoś może być zainteresowany użyciem odbicia, aby zachowywał się nieoczekiwanie lub ulegał awarii).


¹ Ponieważ klasa jest poprawnie udokumentowana, ponieważ istnieje wystarczająca liczba testów jednostkowych, aby upewnić się, że żaden inny programista nie złamie tej metody itp.

Arseni Mourzenko
źródło
czy klasy pochodne będą mogły wywoływać metody prywatne?
oenone

Odpowiedzi:

16

Oznaczając metodę jako prywatną, ustaliłeś swoje zamiary i umowę. Korzystając z refleksji, kod klienta może zdecydować się na zerwanie z tą umową i w konsekwencji będzie musiał ponieść konsekwencje. To samo dzieje się z protokołami, aby rzeczy działały, muszą być przestrzegane reguły, w przeciwnym razie mogą się zdarzyć złe rzeczy.

Ten sam problem może wystąpić w przypadku innych języków, takich jak C ++, w których widziałem takie rzeczy

#define private public

Podsumowując - NIE jesteś zobowiązany do radzenia sobie z tymi sytuacjami, dzwoniący powinien wiedzieć lepiej.

Otávio Décio
źródło
3
Widziałem, jak ludzie rzucają klasy na (unsigned char *) i piszą bezpośrednio do przesunięcia pamięci zmiennej członka, którą chcą zmienić. Moje oczy krwawiły.
Shawn D.,
6
Dodałbym, że ochrona twojej klasy przed niebezpiecznym uprzywilejowanym kodem jest zasadniczo niemożliwa . Jeśli uda ci się jakoś uchronić przed niewłaściwym użyciem odbicia, ktoś znajdzie inny sposób na zrujnowanie twojego dnia, być może po prostu poprzez bezpośrednie zastąpienie pamięci procesu. Kodowanie obronne ostatecznie osiąga punkt malejących zwrotów, a refleksja jest daleko poza tym punktem.
Aaronaught
5

Jeśli ktoś używa refleksji do wywołania twoich prywatnych metod, jest to znak, że ktoś robi coś złego. Albo używa kodu w sposób, dla którego nie został zaprojektowany, albo ukrywasz za dużo wewnętrznych mechanizmów i głupisz API.

Ale brzmi to tak, jakbyś jeszcze nie był na tym etapie i starasz się być wyprzedzający. Więc moim zdaniem: nie martw się o to. Metodę prywatną należy uznać za niedostępną; jeśli ktoś celowo narusza te granice, to jest ich problem, jeśli coś wybuchnie.

Mike Baranczak
źródło
0

Cóż, zawsze dobrym pomysłem jest sprawdzanie zmiennych nielokalnych przed ich użyciem, ale poza tym nie martwię się o to. Jak powiedzieli inni, ustaliłeś swoje zamiary, czyniąc metodę przede wszystkim prywatną; każdy dzwoniący spoza twojej klasy ma zerowe gwarancje. Pracując w Javie, nawet nie umieszczam komentarzy javadoc na moich prywatnych metodach, ponieważ nie chcę, aby inni programiści nawet wiedzieli, że tam są.

TMN
źródło