Po co używa się metod statycznych?

0

Cześć

Po co używa się metod statycznych, kiedy mogę np. pole statyczne nadpisać (dla całej klasy) używając zwykłej metody i wywołać ją na rzecz obiektu danej klasy?
Czytam książkę i tam tego nie wyjaśniono, a testując widzę, że mogę statyczne pole edytować metodą statyczną jak i "zwykłą".

0

Statycznych zmiennych używasz wtedy kiedy wartość jest niezależna od instancji.

Załóżmy że masz klasę trójkąt. Ta klasa może mieć:

  • Zmienne niestatyczne: kolor, długość boku X, długość boku Y i tak dalej
  • Zmienne statyczne: ilość boków
0
atmal napisał(a):

Ale mi chodzi o to, że zmienną statyczną mogę używać w metodzie statycznej i niestatycznej (z zachowaniem jej niezależności od instancji) - w związku z tym po co są metody statyczne? Co mi dają takie metody?

0

Np. to że nie musisz tworzyć obiektu.

0

Tak jak kolega wyżej mówi, poza tym możesz mieć klasę Samochód która ma

  • Statyczną metodę toKilometers(int miles), bo nie trzeba mieć samochodu (obiektu) aby zmienić kilometry na mile.
  • Niestatyczną - fillTank(int litres) - w tym wypadku chodzi nam o konkretny samochód do którego chcemy wlać paliwo.
0

Albo jak chce się zrobić coś z kilkoma obiektami które są równoważne to można użyć metody statycznej, która przyjmuje jako argumenty obiekty tej klasy. Zwykła metoda zmusza cię do wywoływania na rzecz konkretnego obiektu a to nie zawsze ma sens.

0
rubesom napisał(a):

Po co używa się metod statycznych, kiedy mogę np. pole statyczne nadpisać (dla całej klasy) używając zwykłej metody i wywołać ją na rzecz obiektu danej klasy?

Po to właśnie, żeby tego nie robić, bo skoro już jest jakieś pole statyczne z jakąś wartością, to zazwyczaj lepiej, żeby każda instancja nie zmieniała go pod siebie.

Czytam książkę i tam tego nie wyjaśniono, a testując widzę, że mogę statyczne pole edytować metodą statyczną jak i "zwykłą".

Generalnie dużo rzeczy można, bo czasami jest taka potrzeba, a czasami lepiej tego nie robić.Rozmawiać można o konkretnych przypadkach.

Celem metod nie jest operowanie na polach tylko wykonywanie operacji. Operacje, które wymagają stanu obiektu implementuje się jako metody instancyjne, a te które go nie potrzebują jako metody statyczne.

0

Poza modyfikatorami dostępu to zmienne i metody statyczne nie różnią się zbytnio od zmiennych i metod globalnych.

0

@TomRiddle: No i właśnie to jest ta różnica -- nie są to metody globalne (w sensie zasięgu), a rzeczy globalne (szczególnie pola, ale i metody bywa że też) to zło.

Chodzi w metodach statycznych o pewne zszycie operacji z klasą nawet, jeśli nie ma obiektów...

0
koszalek-opalek napisał(a):

Chodzi w metodach statycznych o pewne zszycie operacji z klasą nawet, jeśli nie ma obiektów...

To akurat zazwyczaj nie ma sensu. Jeżeli metoda nie operuje na danych klasy, to nie ma ona związku z odpowiedzialnością tej klasy, a więc trzymanie jej tam łamie SRP, co za tym idzie wypada ją wydzielić do innej klasy.

0
somekind napisał(a):
koszalek-opalek napisał(a):

Chodzi w metodach statycznych o pewne zszycie operacji z klasą nawet, jeśli nie ma obiektów...

To akurat zazwyczaj nie ma sensu. Jeżeli metoda nie operuje na danych klasy, to nie ma ona związku z odpowiedzialnością tej klasy, a więc trzymanie jej tam łamie SRP, co za tym idzie wypada ją wydzielić do innej klasy.

No nie, w standardowych bibliotekach różnych języków mamy pełno metod statycznych/klasowych i zwykle chyba nie łąmią SRP...

0

@koszalek-opalek: a konkretny przykład? Taki, w którym wydzielenie takiej metody statycznej do innej klasy będzie nieuzasadnione.

Bo jak znam standardowe biblioteki różnych języków to generalnie piękne źródło antywzorców. No i to, że coś jest w bibliotece standardowej w ogóle nie jest argumentem przeciwko mojej tezie. Jeśli coś nie operuje na polach, to znaczy, że najprawdopodobniej nie ma związku z klasą. A jeśli nie ma związku z klasą, to czemu w ogóle w niej jest?

0

Operowanie na polach to nie jedyny związek z klasą... A SRP to nie świętość... :)

Czy lepiej zamiast Math.sin(), Math.cos() itp. byłoby mieć Sin.compute(), Cos.compute(), albo jeszcze lepiej new Sin().compute(), new Cos().compute()?

PS. Nie jestem fanem metod statycznych i nie pamiętam, żebym w realnym kodzie kiedyś jakąś napisał... :)

0

@koszalek-opalek: a jakie pola instancyjne ma klasa Math i w jakim celu tworzy się jej obiekty?

Chyba mnie nie zrozumiałeś - ja nie napisałem, że klasa statyczna z metodami statycznymi nie ma sensu, bo to akurat jest zasadne rozwiązanie dla różnych utilsów, helperów i takich rzeczy jak Math właśnie. Mnie chodziło tylko o to, że nie mają sensu metody statyczne w klasie instancyjnej i trzeba je wydzielać do innych klas, statycznych najczęściej.

0
rubesom napisał(a):

Ale mi chodzi o to, że zmienną statyczną mogę używać w metodzie statycznej i niestatycznej (z zachowaniem jej niezależności od instancji) - w związku z tym po co są metody statyczne? Co mi dają takie metody?

Po prostu umozliwiają Ci programowanie:) Jak Masz taki układ programu, że Potrzebujesz funkcji, a nie metody (która zawsze musi być na jakimś obiekcie), to Tworzysz sobie obiekt z metodą/metodami statyczną/statycznymi, Importujesz w odpowiednim miejscu i już. Używa sie jak funkcji z biblioteki standartowej, np. Math.sin(arg)

1

W klasie instancyjnej też np jak inicjalizacja wymaga jakiś niestabilnych operacji - wtedy możesz używać metody jako konstruktora albo po prostu oddzielne kreator stworzyć. Konstruktur nie powienien zwracać wyjątku raczej.
No dużo zastosowań jest.
Najczęsciej to właśnie extensiony, helpersy czy serwisy w których nie ma korzyści z instancjonowania lub po prostu wedle uznania.

0
Smutny Kot napisał(a):

W klasie instancyjnej też np jak inicjalizacja wymaga jakiś niestabilnych operacji - wtedy możesz używać metody jako konstruktora albo po prostu oddzielne kreator stworzyć. Konstruktur nie powienien zwracać wyjątku raczej.

No tak, tu zgoda - statyczna metoda jako metoda wytwórcza obiektów danej klasy ma faktycznie duży sens.

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