Zainicjalizowanie zmiennej finalnej w trakcie inizjalizacji klasu

Zainicjalizowanie zmiennej finalnej w trakcie inizjalizacji klasu
SR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

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ć ?

Korges
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 629
1

Klasy nie powinny zależeć od siebie. Nawet Pudzian to wie.

E9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 217
1

Ale zaraz... nie chodzi o coś takiego po prostu?

Kopiuj
public class SomeClass {
  private final String someValue;

  public SomeClass(SomeOtherClass otherClass) {
    this.someValue = otherClass.otherValue;
  }
}

@Korges:

Klasy nie powinny zależeć od siebie.

Dependency Injection?

S9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1092
2

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.

Kopiuj

  public final class HashMap<K,V>  implements Map<K,V> {
 //coś tam coś tam
 
 private final Entry<K,V>[] bucket; 
//coś tam coś tam

  }
AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
2
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

E9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 217
1

@Korges:

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.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

@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.

SR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

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

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
0

@Sratata: co to za system IBM? MQ? DB2? AIX? iSeries?

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
1
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ć.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.