Cześć
W trakcie inicjalizacji klasy chciałbym aby była pobierana wartość z innej klasy i została zapisana w zmiennej( tak aby po jej pierwszej inicjalizacji nie mozna było jej zmienić). Jak to mogę zrobić ?
- Rejestracja:około 4 lata
- Ostatnio:około 4 lata
- Postów:2
- Rejestracja:ponad 8 lat
- Ostatnio:3 dni
- Postów:216
- Rejestracja:ponad 4 lata
- Ostatnio:około 2 lata
- Lokalizacja:Warszawa
- Postów:1092
Jezu weźcie ludzie przestańcie pisać o wartości klasy, nie ma czegoś takiego, oczy krwawią jest tylko wartość obiektu (no chyba że mówimy o instacji Class ). Generalnie najlepszy mechanizm w tym przypadku to dependency injection przez konstruktor
Co jak ta SomeOtherClass zmieni wartość w trakcie bo coś tam?
@Korges no na ogół obiekty powinny być niemutowalne że jest wyjątkowa potrzeba np. masz jakiś Provider który pobiera coś z API i ma jakiś cache typu ConcurrentHashMap. A od tego jest mechanizm enkapsulacji i nie powinno to wypływać na zewnątrz.
Klasy nie powinny zależeć od siebie. Nawet Pudzian to wie.
public final class HashMap<K,V> implements Map<K,V> {
//coś tam coś tam
private final Entry<K,V>[] bucket;
//coś tam coś tam
}
- Rejestracja:ponad 6 lat
- Ostatnio:2 dni
- Postów:3561
Korges napisał(a):
Klasy nie powinny zależeć od siebie. Nawet Pudzian to wie.
jest wiele przypadków, że będą zależeć, i będzie to poprawne.
Np klasy w pakiecie, wspólnie implementujące jakieś rozwiązanie, zwykle nie tylko będą tak robić, ale nawet dość intensywnie i agresywnie (po elementach niepublicznych)
Sratata napisał(a):
Cześć
W trakcie inicjalizacji klasy chciałbym aby była pobierana wartość z innej klasy i została zapisana w zmiennej( tak aby po jej pierwszej inicjalizacji nie mozna było jej zmienić). Jak to mogę zrobić ?
1 podaj przykład, tylko nie Class1 i Class2, ale realny, z porządnymi nazwami. Jabłko, Gruszka Owoc, KoszykzOwocami
2 Uporządkuj słownictwo, po pierwsze nie ma czegoś jak "wartość klasy", nie ma "zmiennej" tylko są pola, prawdopodobnie chcesz "podczas inicjalizacji obiektu klasy" itd. Słowa są ważne
@ Koledzy: chyba wyrok o dependency injection jest przedwczesny, dopóki OO nie sprecyzuje. Pytanie jest nieścisłe i (pod domyśleniu się o co chodzi) cholernie ogólne, ja NIC tam nie czytam nt wstrzykiwania.
Z tego co wiem, new
nie został wycofany aż do Javy 16
static
w klasie B, który jest wykorzystywany w konstruktorze klasy A, albo stworzenie nowej instancji klasy B w konstruktorze klasy A. Jak widać druga opcja jest mocno średnia, nie mówiąc nawet o trzeciej, wiec na dobrą sprawę zostaje tylko opcja z przekazaniem przez konstruktor. #Edit. jest w sumie jeszcze 4 opcja, z wykorzystaniem dziedziczenia, ale to jeszcze większy wtf jak opcja 2 i 3.
- Rejestracja:ponad 8 lat
- Ostatnio:3 dni
- Postów:216
Pytanie jest nieścisłe i (pod domyśleniu się o co chodzi) cholernie ogólne, ja NIC tam nie czytam nt wstrzykiwania.
Może warto uściślić, żeby nie mylić DI i IoC. Wstrzykiwanie zależności to jest wzorzec w którym po prostu dane użyte w komponencie A, nie są stworzone wewnątrz tego komponentu tylko przekazane z zewnątrz. Czyli nie ma tu mowy o Springu czy innym frameworku, po prostu klasa A w konstruktorze czy tam setterze przyjmuje jakieś parametry, które poziom wyżej mogą być stworzone przez new
. Innymi słowy, przekazanie instancji klasy A do konstruktora klasy B, i użycie danych tej instancji A wewnątrz B to już jest wstrzykiwanie zależności.

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
@Sratata chodzi o zależność od klasy
czy od obiektu
? Różnica jak między piciem w Szczawnicy i szczaniem w piwnicy.
Zakładam ze chodzi o zależność od jakiegoś innego obiektu -> przekaż go jako parametr konstruktora.
- Rejestracja:około 4 lata
- Ostatnio:około 4 lata
- Postów:2
Problem jest w tym że potrzebuje to zrobić na systemie IBM. Potrzebuje pobrać argument tego obiektu przy inicjalizacji jego. Po chwili ten sam argument będzie zmieniany i potrzebuje go porównać z pierwotnym argumentem
- Rejestracja:ponad 6 lat
- Ostatnio:2 dni
- Postów:3561
Sratata napisał(a):
Problem jest w tym że potrzebuje to zrobić na systemie IBM. Potrzebuje pobrać argument tego obiektu przy inicjalizacji jego. Po chwili ten sam argument będzie zmieniany i potrzebuje go porównać z pierwotnym argumentem
1.Obiekty nie mają argumentów.
2.To na IBM jest jakaś inna Java i OOP?
Gosling się na tapczanie przewraca. Złej baletnicy ...
Słuchaj @Sratata, widać, ze nie jesteś nadmiernie doświadczony (delikatnie mówiąc). Więc może dla własnego dobra konkret? Kod, a nie psycho-filozofia? Bo w tym filozofowaniu nawet nie udaje się słów dobrać.

99xmarcinCo jak ta SomeOtherClass zmieni wartość w trakcie bo coś tam?
- no i co z tego?SomeClass
ma niemutowalną kopie tej wartości, jeżeliSomeOtherClass
zmieni coś w środku to nas to nie interesuje.Nie lepiej się odwołać do tej klasy?
- nie rozumiem, jak chcesz się do tej klasy odwołać nie przekazując jej w konstruktorze bądź wstrzykując w inny sposób?To jest złe z definicji.
- złe z definicji jest inicjalizowanie pól oznaczonych jakofinal
na podstawie innych klas? A jak nie jestfinal
to można? Kompletnie nie rozumiem Twojego podejścianew SomeClass(someOtherClass.getOtherValue())
. Ale masz rację ;)