Statyczna metoda, a 'bezpieczeństwo' klasy narzędziowej

0

Robię małą klase narzędziową, którą będę używał w moim kodzie.
Kod ten nie jest na wielu wątkach. Jest to po prostu powiedzmy serwis restowy, który moze uzywać kilkudziesięciu użytkowników równocześnie.

Czy jest jakieś ryzyko, gdy zamiast w moim kodzie:

private SUtil sUtil = new SUtil():

zrobię metody z klasy narzędziowej statyczne i użyje w moim kodzie?

Które rozwiązanie jest lepsze i czy generalnie istnieje case (nie tylko w moim przykładzie restowym) kiedy statyczna metoda będzie działać gorzej (czy tam powodować problemy) niż 'normlany obiekt' przez zawieranie?

0

To zależy od tego co ta klasa robi. Jak to jest jakis StringUtils to nie ma znaczenia, ale jeśli klasa wymaga jakiejś synchronizacji albo jest stateful to wygląda to zupłnie inaczej.

0

ok, czyli generalnie nie ma komplentnie znaczenia w jakimkolwiek kodzie się tę klase narzędziową używa, ale tylko co ona robi?

0

Nie ma to większego znaczenia. Oczywiście static wprowadza inne problemy, np. z testowaniem jednostkowym (bo podmienic statica na coś innego na czas testu nie tak łatwo) oraz nie wspiera polimorfizmu (znów, podmiana implementacji jest kłopotliwa), ale wszystko rozbija sie o to "co ta klasa robi". Bo np. nie ma najmniejszego sensu mockowanie w testach czy overridowanie StringUtils, ale jak zrobisz jakiś MyBussinessLogicUtils to moze się okazać że już tak dobrze nie jest.

0

Jeśli to klasa util będzie się łączyć z jakimiś serwisami zewnętrznymi albo bazą danych to lepiej zrób ją polimorficznie. Unikniesz jej mockowania które z tego co wiem słabo działa z istniejącymi rozwiązaniami (np. PowerMock - jakieś wycieki czy coś).
Jeśli klasa jest samowystarczalna - może być statycznie, z tym że w przypadku logiki biznesowej zawsze może się okazać że jednak kiedyś będzie miała zależności j.w. - co wtedy zrobisz?

0

ok, dzięki

a tak trochę w związku z powyższym, 2 kolejne pytania:

  1. Dobrze rozumiem, że statyczna wewnętrzna klasa nie jest współdzielona przez wszystkie instancje klasy zewnętrznej. W tym wypadku może ona przechowywać stan dla danej instancji obiektu zewnętrznego? (static ma tu inne znaczenienie niż dla zmiennej/ metody)

  2. Mam metodę statyczną Z::y(B b, C c) wołaną z metody klasy niestatycznej A::aa(). Klasa Z to typowy Util.
    Metoda statyczna y zaczytuje parametr z pliku do zmiennej lokalnej dla tej metody. Czy nie ma tu ryzyka, że przy wielu wywołaniach metody y (asynchronicznie, jakieś timery itp.) wartośc tego parametru zaczytanego z pliku będzie niepoprawna? Jesli nie, to dlaczego?

1 użytkowników online, w tym zalogowanych: 0, gości: 1