JAVAコールバックをクラス間で実行するには?[重複しています]。
2023-09-09 02:21:39
質問
私は、コールバックが非常に簡単であるJavaScriptから来ています。私は、JAVAにそれらを実装しようとしていますが、成功しません。
私は親クラスを持っています。
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Server {
ExecutorService workers = Executors.newFixedThreadPool(10);
private ServerConnections serverConnectionHandler;
public Server(int _address) {
System.out.println("Starting Server...");
serverConnectionHandler = new ServerConnections(_address);
serverConnectionHandler.newConnection = function(Socket _socket) {
System.out.println("A function of my child class was called.");
};
workers.execute(serverConnectionHandler);
System.out.println("Do something else...");
}
}
そして、親クラスから呼び出される子クラスがあります。
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ServerConnections implements Runnable {
private int serverPort;
private ServerSocket mainSocket;
public ServerConnections(int _serverPort) {
serverPort = _serverPort;
}
@Override
public void run() {
System.out.println("Starting Server Thread...");
try {
mainSocket = new ServerSocket(serverPort);
while (true) {
newConnection(mainSocket.accept());
}
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void newConnection(Socket _socket) {
}
}
を実装する正しい方法は何ですか?
serverConnectionHandler.newConnection = function(Socket _socket) {
System.out.println("A function of my child class was called.");
};
の部分は、Parent クラスで、明らかに正しくないのでは?
どのように解決するのですか?
インターフェースを定義し、コールバックを受け取るクラスで実装します。
マルチスレッドに注意しましょう。
interface CallBack {
//declare an interface with the callback methods,
//so you can use on more than one class and just
//refer to the interface
void methodToCallBack();
}
class CallBackImpl implements CallBack {
//class that implements the method to callback defined
//in the interface
public void methodToCallBack() {
System.out.println("I've been called back");
}
}
class Caller {
public void register(CallBack callback) {
callback.methodToCallBack();
}
public static void main(String[] args) {
Caller caller = new Caller();
CallBack callBack = new CallBackImpl();
//because of the interface, the type is Callback even
//thought the new instance is the CallBackImpl class.
//This alows to pass different types of classes that have
//the implementation of CallBack interface
caller.register(callBack);
}
}
あなたの場合、マルチスレッドを除けば、次のようにすることができます。
interface ServerInterface {
void newSeverConnection(Socket socket);
}
public class Server implements ServerInterface {
public Server(int _address) {
System.out.println("Starting Server...");
serverConnectionHandler = new ServerConnections(_address, this);
workers.execute(serverConnectionHandler);
System.out.println("Do something else...");
}
void newServerConnection(Socket socket) {
System.out.println("A function of my child class was called.");
}
}
public class ServerConnections implements Runnable {
private ServerInterface serverInterface;
public ServerConnections(int _serverPort, ServerInterface _serverInterface) {
serverPort = _serverPort;
serverInterface = _serverInterface;
}
@Override
public void run() {
System.out.println("Starting Server Thread...");
if (serverInterface == null) {
System.out.println("Server Thread error: callback null");
}
try {
mainSocket = new ServerSocket(serverPort);
while (true) {
serverInterface.newServerConnection(mainSocket.accept());
}
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
マルチスレッド
これはマルチスレッドを扱わないことを覚えておいてください。これは別のトピックであり、プロジェクトによってさまざまなソリューションがあります。
オブザーバパターン
observer-patternはほぼ同じことをしますが、大きな違いは
ArrayList
を使うことです。これが必要ない場合は、1つの参照でより良いパフォーマンスを得ることができます。
関連
-
Uncaught ReferenceError: は定義されていません。
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse問題 アクセス制限。タイプ 'SunJCE' が API でないことを解決し、/jdk ディレクトリにある /jre と jre の違いについて理解を深める。
-
executeQuery()でデータ操作文が発行できない。解決方法
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
Junitのユニットテストはjava.lang.Testを報告します。
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
API の戻り値を処理するために ResponseEntity を使用する
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
Server Tomcat v9.0 Server at localhost の起動に失敗しました。
-
[解決済み] Javaにおけるコールバック関数
-
[解決済み] Javaで関数をパラメータとして渡すには?[重複しています]。