Dostęp do obiektu z innej klasy

0

Witam serdecznie, mam pewien kłopot piszą program konsolowy w Javie. Mam klasę, która "loguje" użytkownika do programu. To znaczy scannerem odpytuję użytkownika o jego ID oraz hasło, następuje odczyt z bazy danych i gdy się zgadza to użytkownika przenosi do innej klasy, gdzie użytkownik ma swoje menu.

Powiedzmy, że ID użytkownika to 10 więc w klasie logującej powstaje obiekt

Student student = entityManager.find(Student.class, 10L);

Jak mogę z tego obiektu korzystać w innych miejscach programu? Bo jeżeli np. tworzę klasę odpowiedzialną za zmianę hasła, to muszę znów pytać użytkownika o jego ID aby stworzyć powyższy obiekt i na nim operować a wszelkie operacje chciałbym robić na jednym powyższym obiekcie który już jest stworzony i ma wprowadzony jednorazowo ID.

Nie chcę za każdym razem pytać użytkownika o ID a chciałbym operować na powyższym raz stworzonym obiekcie w wielu miejscach w programie

Proszę o pomoc :)

2

Pokaż cały kod

1
Riddle napisał(a):

Pokaż cały kod

+1

JavacMainjava napisał(a):

Powiedzmy, że ID użytkownika to 10 więc w klasie logującej powstaje obiekt

Student student = entityManager.find(Student.class, 10L);

Jak mogę z tego obiektu korzystać w innych miejscach programu?

jest o wiele, wiele za wcześnie na zajmowanie się entity managerami. Najier musisz naprawdę dobrze poznać Javę jako taką i programowanie obiektowe - samo pytanie to pokazuje.

0
Riddle napisał(a):

Pokaż cały kod

Ogólnie to cały kod mojego programu ma kilka tysięcy linijek kodu a nie do końca wiem, który fragment mógłbym pokazać aby można było coś pomyśleć nad moim problemem. Na ten moment program jest napisany w taki sposób, że za każdym razem w każdym miejscu gdzie tego wymaga, proszę użytkownika o podanie swojego ID i hasła aby móc np. zmienić hasło, zmienić dane, dodać usunąć kogoś z relacji (ManyToMany) itp itd. Chcę jedynie zrobić taki refaktor kodu, gdzie:

  1. Użytkownik na wstępie loguje się podając ID oraz hasło. Jeżeli są poprawne z bazą danych, następuje przekierowanie do nowej klasy gdzie jest menu.
  2. Użytkownik znajduje się więc w swoim menu i ma m.in możliwość zmiany hasła. Np. kliknij 1 aby przejść do zmiany hasła
  3. Użytkownik wciska "1", Scanner sczytuje i przerzuca do osobnej klasy odpowiadającej za zmianę hasła

4.(błędne, aktualne) W nowej klasie użytkownik znów musi podać id oraz hasło aby ustawić nowe, muszę stworzyć kolejny obiekt entity managerem podając ID... czyli następuje mocna fuszerka w programie.

4.(powinno być poprawnie) W nowej klasie użytkownik podaje tylko swoje hasło w celach weryfikacji a następnie ustawia sobie elegancko nowe hasło. // czyli powinienem z raz stworzonego obiektu z wpisanym na początku ID (w innej klasie) móc korzystać już w tej klasie bez proszenia po raz kolejny o ID..

A jeszcze inaczej, prościej napiszę przykładowy kod, może on bardziej zobrazuje problem:

public class KlasaLogujaca {
System.out.println("Podaj swój id");
int twojId = scanner.nextInt();

Student student = entityManager.find(Student.class, twojId);
}

====================================================

public class KlasaZmieniającaHasło {

System.out.println("Podaj swoje haslo w celach weryfikacji"))
String hasloDoWeryfikacji = scanner.nextLine();

// i tutaj chcę właśnie z klasy logującej użyć sobie student.getPassword() i sprawdzić czy się zgadza hasło, tylko jak uzyskać dostęp do obiektu studenta z raz wpisanym w klasie logującej ID

// a teraz mój program działa na takiej zasadzie, że nawet w tej klasie pytam PONOWNIE o ID i wtedy tworzę nowy obiekt entity managerem i dopiero wtedy mogę zmieniać parametry w bazie danych


0
JavacMainjava napisał(a):
public class KlasaLogujaca {
System.out.println("Podaj swój id");
int twojId = scanner.nextInt();

Student student = entityManager.find(Student.class, twojId);
}

====================================================

public class KlasaZmieniającaHasło {

System.out.println("Podaj swoje haslo w celach weryfikacji"))
String hasloDoWeryfikacji = scanner.nextLine();

// i tutaj chcę właśnie z klasy logującej użyć sobie student.getPassword() i sprawdzić czy się zgadza hasło, tylko jak uzyskać dostęp do obiektu studenta z raz wpisanym w klasie logującej ID

// a teraz mój program działa na takiej zasadzie, że nawet w tej klasie pytam PONOWNIE o ID i wtedy tworzę nowy obiekt entity managerem i dopiero wtedy mogę zmieniać parametry w bazie danych


Klasyczny przerost formy nad treścią: tzn używasz entity managera, ale nie potrafisz przekazać parametru. To trochę jakbyś chciał jeździć w wyścigach, ale nie wiesz jak się zmienia biegi.

Czemu w ogóle pracujesz nad tym programem?

A odpowiadając na Twoje pytanie, to w każdym miejscu gdzie chcesz użyć id'ka usera, powinieneś wydzielić metodę, np getMyId(). Jeśli jest to tylko w jednej klasie to może być metoda w klasie, jeśli nie, to powinieneś to wydzielić do innej klasy i przekazać jako parametry. Ta klasa z kolei powinna najpierw poprosić usera o hasło/id, zapisać to sobie w polu, i kiedy następnym razem ktoś wywoła getMyId(), to klasa po prostu powinna zwrócić wartość z pola.

0
JavacMainjava napisał(a):
public class KlasaLogujaca {

...

public class KlasaZmieniającaHasło {>

Hmmmm .. Houston, mamy problem.

Nie wiem, jak wygląda reszta z "tysięcy linii kodu", ale już to mi mówi, że ze świadomością obiektową dobrze nie jest.
Dla mnie najmniejsze znaczenie ma język polski (choć docelowo zmiana na ang oczywiście tak).

Nie masz pomysłu na klasy (zakładając, że kod odpowiada nazwom klas - nadal go ukrywasz).
Imiesłów to by było dobre na nazwę interfejsu (dobrze zaprojektowany interface skupia się na zdolnosci do jednej czynności, po angielsku często ".....able").
Drugim dowodem, że czujesz się bezradny na lodzie, po powtarzanie Klasa w nazwie class

Klasa ma szczęśliwie określać zakres funkcjonalności, zakres a nie jedną czynność. Owszem, czasem zakres to jedna, ale najczęściej "rozsadny zakres" (nie umiem tego jaśniej okreslić zwł. w świecie początkującego)
Tu "rozsądnym zakresem" zdecydowanie by było "całość tematu autoryzacji" *). Masz nadmiernie (a w dodatku nieortogonalnie) pocięte klasy, to i masz głód na przekazywanie danych

Usilnie cię proszę, odstaw projekt na bok **), mocno dowartościuj programowanie obiektowe. Nie wiem czego tam używasz, jakiego kursu, podręcznika, ale jest kiepsko. To tak jak z pływaniem, grą na instrumencie: najgorsze, to nauczyć się źle - lepiej nie umieć nic.

*) co nie oznacza jednej, jedynej klasy. Pewnie podział na ManagaerAuroryzacyjny (ew. MenagerHaseł - wszytko to są jeśli nie dobre, to przynajmniej mało złe nazwy) i SesjaAutoryzacji to podstawa.
**) osobiscie sądzę, że jeśli zrealizujesz wiedze z OOP, sam nie będziesz chciał do tego wracać

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