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ć ?
Zainicjalizowanie zmiennej finalnej w trakcie inizjalizacji klasu
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2
- Rejestracja: dni
- Ostatnio: dni
- Postów: 629
Klasy nie powinny zależeć od siebie. Nawet Pudzian to wie.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 217
Ale zaraz... nie chodzi o coś takiego po prostu?
public class SomeClass {
private final String someValue;
public SomeClass(SomeOtherClass otherClass) {
this.someValue = otherClass.otherValue;
}
}
Klasy nie powinny zależeć od siebie.
Dependency Injection?
- Rejestracja: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: 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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 217
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: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: dni
@Sratata: co to za system IBM? MQ? DB2? AIX? iSeries?
- Rejestracja: dni
- Ostatnio: 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ć.