Проблема рефакторинга анонимного класса - PullRequest
0 голосов
/ 10 января 2020

Я использую nv-websocket-client lib для подключения URL-адреса веб-сокета. Я вижу некоторые примеры в документе для подключения URL, как показано ниже,

private static WebSocket connectSocket() {
        return new WebSocketFactory()
                .createSocket("http://...")
                .addProtocol(8081)
                .addListener(new WebSocketAdapter() {

                    public void onTextMessage(WebSocket websocket, String message) throws JSONException {
                        if (!message.isEmpty()) {

                            JSONArray jsonArray = new JSONArray(message);

                            for (int i = 0; i < jsonArray.length(); ++i) {
                               // TODO : Method Invocation
                            }
                        }
                    }
                    public void onConnected(WebSocket websocket, Map<String, List<String>> headers) throws JSONException {
                        // TODO : Method Invocation
                    }
                })
                .addExtension(WebSocketExtension.PERMESSAGE_DEFLATE)
                .connect();
    }

используется анонимный класс, и я вижу, что есть два метода onTextMessage и onConnected

, которые я хотел бы Использовать функциональный подход и ссылаться на https://blog.codefx.org/techniques/getting-rid-of-anonymous-classes/ блог попытался рефакторинг моего кода. Моя попытка, как показано ниже,

private static WebSocket connectionSocket(){

WebSocketFactory socketFactory = new WebSocketFactory();
WebSocket webSocket = socketFactory.createSocket(connectionParameters.getWssHostName());
webSocket.addProtocol(connectionParameters.getProtocol());
//new FunctionalWebSocketListener(webSocket, ); 
//webSocket.addListener();
webSocket.addExtension(WebSocketExtension.PERMESSAGE_DEFLATE);
webSocket.connect();

return webSocket;

}

public class FunctionalWebSocketListener implements WebSocketListener {

    private final BiConsumer<WebSocket, String> textMessage;
    private final BiConsumer<WebSocket, Map<String, List<String>>> connectionMessage;

    public FunctionalWebSocketListener(BiConsumer<WebSocket, String> textMessage,
                                       BiConsumer<WebSocket, Map<String, List<String>>> connectionMessage) {
        this.textMessage = textMessage;
        this.connectionMessage = connectionMessage;
    }

    @Override
    public void onTextMessage(WebSocket websocket, String text) throws Exception {
        textMessage.accept(websocket,text);
    }


    @Override
    public void onConnected(WebSocket websocket, Map<String, List<String>> headers) throws Exception {
            connectionMessage.accept(websocket, headers);
    }

    // rest of un-implemented method goes here
}

Не удалось продолжить, и завис, и я хотел извлечь два отдельных метода publi c и предоставить доступ к другому классу.

Любая помощь высоко ценится?

//new FunctionalWebSocketListener( p1, p2 );  //  Not clear what consumer to be passed here. 
//webSocket.addListener();


...