Skąd wiadomo, jaki konstruktor stworzyć?

0

Czy mógłby mi ktoś wytłumaczyć konstruktory? Męczę się z tym od pewnego czasu i nie potrafię załapać. Rozumiem, że konstruktor stosujemy w celu zainicjowania obiektu, ale skąd wiemy JAK konstruktor ma wyglądać? Chodzi mi o parametry? Niekiedy konstruktory mają pustą listę, a niekiedy mają ich 10. Załóżmy, że tworzę klasę z 5 zmiennymi, skąd mam wiedzieć jaki konstruktor stworzyć? Błagam o pomoc!

2

To zależy od sytuacji.
Generalnie jeśli masz niemutowalne obiekty (wszystkie pola są final) to wszystkie parametry muszą iść do konstruktora. I to zwykle jest dobre rozwiazanie.
Jeśli masz parametrów dużo, albo są tego samego typu, albo jest dużo parametrów opcjonalnych to taki konstruktor robisz prywatny i dodajesz Buildera.

Obiekty z pustym konstruktorem i setterami tylko i wyłącznie jako jakieś DTO mapowane na JSONa czy XMLa, jeśli biblioteka/framework tego wymaga.

0
szyyszka napisał(a):

Czy mógłby mi ktoś wytłumaczyć konstruktory? Męczę się z tym od pewnego czasu i nie potrafię załapać. Rozumiem, że konstruktor stosujemy w celu zainicjowania obiektu, ale skąd wiemy JAK konstruktor ma wyglądać? Chodzi mi o parametry? Niekiedy konstruktory mają pustą listę, a niekiedy mają ich 10. Załóżmy, że tworzę klasę z 5 zmiennymi, skąd mam wiedzieć jaki konstruktor stworzyć? Błagam o pomoc!

Kod np klasy NIE JEST pierwotną, bazową rzeczą. Bazowy jest PROJEKT, CEL, ZAMIAR zrobienia klasy (oczywiście raczej nie spisany, ale przemyślany). Jak jest klasa-zlepek łącząca pomarańcze, jabłka i ziemniaki, to żaden kod konstruktora tego nie uratuje.

bez odpowiedzi W JAKIM CELU powstałą ta klasa, odpowiedź o konstruktor(y) jest nierozstrzygalna. I "błagam" nie pomoże.

0

Wszystko zależy w jaki sposób chcesz przypisywać wartości do zmiennych klasowych. Jeżeli chcesz robić to w momencie tworzenia instancji klasy to używaj odpowiedniego konstruktora, inną metodą jest korzystanie z settera, można także oznaczyć dane pole jako public co nie jest dobrą praktyką i nie jest zgodne z enkapsulacją. Jeżeli masz konstruktory z dużą ilością parametrów można zastanowić się nad używaniem konstruktorów teleskopowych, wtedy nie musisz inicjalizować wszystkich pól na raz, jednak jest to słabe rozwiązanie, gdy nie chcesz doprowadzić do sytuacji w której obiekt nie jest w stanie spójności. Wtedy można stworzyć builder, który zbierze wszystkie parametry i utworzy gotową instancję twojej klasy. Wszystko zależy od sytuacji i efektu jaki chcesz uzyskać.

2
AnyKtokolwiek napisał(a):
szyyszka napisał(a):

Czy mógłby mi ktoś wytłumaczyć konstruktory? Męczę się z tym od pewnego czasu i nie potrafię załapać. Rozumiem, że konstruktor stosujemy w celu zainicjowania obiektu, ale skąd wiemy JAK konstruktor ma wyglądać? Chodzi mi o parametry? Niekiedy konstruktory mają pustą listę, a niekiedy mają ich 10. Załóżmy, że tworzę klasę z 5 zmiennymi, skąd mam wiedzieć jaki konstruktor stworzyć? Błagam o pomoc!

Kod np klasy NIE JEST pierwotną, bazową rzeczą. Bazowy jest PROJEKT, CEL, ZAMIAR zrobienia klasy (oczywiście raczej nie spisany, ale przemyślany). Jak jest klasa-zlepek łącząca pomarańcze, jabłka i ziemniaki, to żaden kod konstruktora tego nie uratuje.

bez odpowiedzi W JAKIM CELU powstałą ta klasa, odpowiedź o konstruktor(y) jest nierozstrzygalna. I "błagam" nie pomoże.

Nie. Konstruktor służy zawsze do jednego, tego samego celu - stworzenia w przynajmniej minimalnym stopniu poprawnego obiektu. Minimalnym, czyli takim, który pozwala na wywołanie wszystkich publicznych metod bez otrzymywania wyjątków bądź prowadzących do niepoprawnego stanu danego obiektu. Konstruktory bezparametrowe to wymysł różnych framework (plus taki, że coraz częściej się od tego odchodzi), które jawnie wymuszają na tobie łamanie podstawowych zasad paradygmatu programowania obiektowego. Tak więc podsumowując: jeśli nie korzysta się z żadnych frameworków, które wymuszają na tobie spieprzony design to tworzysz konstruktory, które tworzą w pełni funkcjonalne obiekty.

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