Przekazywanie danych pomiędzy obiektami różnych klas

0

Witam,

Chciałbym zapytać, czy w Javie jest jakiś mechanizm pozwalający na przekazywanie danych pomiędzy obiektami różnych klas? Lub jak takie komunikacje powinny być implementowane?

Przykładowy rzut na zamysł o który mi chodzi:

public class ServerSocket
{
	ServerSocket() {
		/** open connection, speak to server and read from */
	}

	public void sendToServer(String msg) {
		/**
			...
		*/
	}

	public String readFromServer() {
		/**
			...
		*/
	}
}

public class User
{
	public void addUser() {
		/**
			read username from keyboard
			send username to server via existing socket
		*/
	}
	
	public String listUsers() {
		/**
			method called when socket get from server <listUsers>user1;user2;user3;(...)</listUsers>
			display users list in specified format
		*/
	}
}

public class MainThread
{
	public static void main(String[] args) {
		ServerSocket serverConnection = new ServerSocket();
		User operator = new User();
		/** Some process here */
	}
}

Pytanie, jak obiekt "operator" może wysłać dane do serwera używając połączenia nawiązanego przez obiekt "serverConnection"?

Oraz odwrotnie, jak "serverConnection" może operować na metodach obiektu "operator"?

Generalnie chodzi o sposób zbierania i przetwarzania (np. wysyłania do serwera) danych wygenerowanych przez inne obiekty oraz odwrotnie - przetwarzania danych z serwera przez odpowiednio wskazany obiekt.

Dodam, że obiektów takich jak operator (innych klas) miałoby być więcej i w miarę czasu jeszcze przybywać.
Ponad to jeśli jest to istotne, każdy obiekt to osobny Thread.

P.S.
Chciałbym zwrócić uwagę, że chodzi o obiekty, a nie klasy, więc o ile rozumiem temat, to dziedziczenie z innej, zbiorczej klasy nie pomoże, gdyż operator i serverConnection nie wiedzą o swoim istnieniu (czy jestem w błędzie?).

0

Poprzez delegacje. Przekazujesz obiektowi operator referencje do obiektu server (np. przez konstruktor albo setter) i voila, od teraz obiekt operator może korzystać z obiektu server.
"Alternatywny" sposób, związany głównie z przekazywaniem zależności między "serwisami" to użycie kontenera IoC do składania aplikacji i zapeniania potrzebnych zależności.

0

Myślałem nad rozwiązaniem opartym o referencje, ale tyle co wymyśliłem to rozwiązuje problem komunikacji między obiektami tylko w jedną stronę, np. operator -> serverConnection. Ponieważ tworzę najpierw obiekt serverConnection, a później operator podając mu referencję do serverConnection.

(..)
public class User
{
	User(ServerSocket server) { /** ... */ }
	// ...
}
// ...
SocketServer serverConnection = new SocketServer();
User operator = new User(serverConnection); // now i know where socket connection is and i can use it
// ...

Jak zaimplementować komunikację w drugą stronę?

0

Poprzez użycie settera na przykład? Niemniej ja bym uważał bo takie powiązanie może się kiedyś skończyć jakimś deadlockiem jak nie będziesz uważał.

0

Kurde, nie rozumiem, jak setter mógłby tu pomóc. Można prosić o jakiś mały przykład?

1

o_O

A a = new A();
B b = new B();
a.setB(b);
b.setA(a);
1
public class A {
    
    private B b;

    public void takeMePlz(B b) {
         this.b = b;
         Things[] ts = b.getThings();
    }

    public void responseHimPlz(Thing t) {
         b.sendBack(t);
    } 

}
....
public class B {

     public B() {
         A a = new A();
         a.takeMePlz(this);
     }

      public void sendBack(Thing t) {
           ....
      }

      public Thing[] getThings() {
             return ts;
      }
}
0
Shalom napisał(a):

o_O

A a = new A();
B b = new B();
a.setB(b);
b.setA(a);

Cholera, tyle nad tym myślałem, że ubzdurałem sobie i uczepiłem się przekazywania referencji w konstruktorach.
Dziękuję bardzo i przepraszam za lamowatość.

Mam nadzieję, że ewentualne kolejne pytania będą mądrzejsze :)

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