yuusuke-roughの日記

荒です。

WebSocketの学習日記 in Spring Boot

はじめに

単体テスト前に技術について整理→コード修正・追加→単体テストの三段構えで行きます。

いつもそのつもりで書いておりますが、完全に日記です。右往左往した苦しい時間もみっちり記録しております。

理解に乏しい部分が多々あります。

ブログ訪問者が0人なのでないとは思いますが、もし、この記事を読まれた方いらっしゃいましたら、ぜひ教えてください。

お願い致します。

 

内容

 

事前知識整理(※分からない事があったら戻る専用)

 

とりあえず、WebSocketとSTOMPの違いから

What is the difference between WebSocket and STOMP protocols? - Stack Overflow

 

STOMP Specification, Version 1.2 日本語訳 · GitHub

 

入門 | WebSocket を使用してインタラクティブな Web アプリケーションを構築

上記は、ただのSTOMPではなく、STOMP over WebSocketで、WebSocket上でSTOMPを使用している。

 

26. WebSocket Support

(3日目に気づく...ここ読まなきゃダメでしょ...orz)

 

 

用語:

メッセージブローカー・・・メッセージの管理等を行いメッセージを送信する機能

STOMP.js・・・STOMP over WebSocket通信をサポートする。

STOMP.js Documentation

Sock.js・・・WebSocketで使用するようなオブジェクトを提供する。

GitHub - sockjs/sockjs-client: WebSocket emulation - Javascript client

 

 

実装のお題

1.ハートビートによるセッション管理

 

 

以前、実装でつまずいた点が、「ハートビートが動作しなくなった時のセッションの切断方法は?」という事だった。

以前から目をつけていたのは

WebSocketHandler (Spring Framework API) - Javadoc

22. WebSocket Support

どう適用すればいいんだろう。

 

WebSocketMessageBrokerConfigurer (Spring Framework API) - Javadoc

にあった。configureWebSocketTransport...そのままの名前...

WebSocketTransportRegistrationにてaddDecoratorFactoryのWebSocketHandlerDecoratorFactoryにて追加ができる。

 

WebSocketHandlerについては、WebSocketHandlerを実現したクラスを使用したい。

だが...

How to chunk large message over stomp with spring boot - Stack Overflow

似たような悩み...情報はなし。頑張る。

 

public class CustomWebSocketHandlerDecoratorFactory implements WebSocketHandlerDecoratorFactory{
    
    private WebSocketHandler webSocketHandler;
    public CustomWebSocketHandlerDecoratorFactory(WebSocketHandler handler) {
        this.webSocketHandler = handler;
    }
    
    @Override
    public WebSocketHandler decorate(WebSocketHandler handler) {
        System.out.println("読み込まれています");
        return handler;
        }
    
    
}

こんなのを考えてみた。

CustomWebSocketHandlerDecoratorFactoryは呼び出した際にWebSocketHandlerを呼び出すのだから、コンストラクタを追加してカスタマイズしたWebSocketHandlerを渡せないかな~って。

 

デバッグすると、decorateはSubProtocolWebSocketHandlerになっている。

没ですね

 

the same handler or the handler wrapped with a subclass of WebSocketHandlerDecorator

とのため、WebSocketHandlerをWebSocketHandlerDecoratorを継承したクラスに渡して、afterConnectionClosedとafterConnectionEstablishedをOverrideして使用する。

 

動いたが、

サーバー側

Failed to parse TextMessage payload=[CONNECT
ac..], byteCount=56, last=true] in session h1rc4zi0. Sending STOMP ERROR to client.

 

No decoder for session id

 

クライアント側

  1. {command: 'ERROR', headers: {…}, body: ''}
    1. body: ""
    2. command: "ERROR"
    3. Prototype: Object

 

WebSocket、SockJs、STOMP、SubProtocol...ごっちゃになってますね。

下記キーワードと概念含めた理解を試みて、残り二日でクリアしたいです。

SubProtocolWebSocketHandler

StompSubProtocolHandler

StompSessionHandlerAdapter

java - Spring STOMP WebSocket session disconnect handler / reconnection handling - Stack Overflow

 

読む

では改めて。SpringドキュメントのWebSocket:26.4から読んでいきます。

STOMP can be used over any reliable 2-way streaming network protocol such as TCP and WebSocket. Although STOMP is a text-oriented protocol, the payload of messages can be either text or binary

 

STOMP is a frame based protocol whose frames are modeled on HTTP.

Command

SEND・・・サーバーの宛先にメッセージを送る

SUBSCRIBE・・・MESSAGEフレームとしてサーバーからメッセージを受信する。

Header

destination・・・SENDなら宛先、SUBSCRIBEなら受信元を示す。受信はMESSAGEフレームとして配信。正常にサブスクライブできない場合はERRORフレームを送信。

 

26.4.2

うーん、どうなんだろう。(自信ない)

 

26.4.3

 

  • Message — a message with headers and a payload.
  • MessageHandler — a contract for handling a message.
  • MessageChannel — a contract for sending a message enabling loose coupling between senders and receivers.
  • SubscribableChannel — extends MessageChannel and sends messages to registered MessageHandler subscribers.
  • ExecutorSubscribableChannel — a concrete implementation of SubscribableChannel that can deliver messages asynchronously via a thread pool.

 

MessageHandlerについては、SubProtocolWebSocketHandlerがサブクラスになっている。

 

  • SessionConnectEvent — published when a new STOMP CONNECT is received indicating the start of a new client session. The event contains the message representing the connect including the session id, user information (if any), and any custom headers the client may have sent. This is useful for tracking client sessions. Components subscribed to this event can wrap the contained message using SimpMessageHeaderAccessor or StompMessageHeaderAccessor.
  • SessionConnectedEvent — published shortly after a SessionConnectEvent when the broker has sent a STOMP CONNECTED frame in response to the CONNECT. At this point the STOMP session can be considered fully established.
  • SessionSubscribeEvent — published when a new STOMP SUBSCRIBE is received.
  • SessionUnsubscribeEvent — published when a new STOMP UNSUBSCRIBE is received.
  • SessionDisconnectEvent — published when a STOMP session ends. The DISCONNECT may have been sent from the client, or it may also be automatically generated when the WebSocket session is closed. In some cases this event may be published more than once per session. Components should be idempotent with regard to multiple disconnect events.

 

落ち込むレベルの話でした。ドキュメント読まずに一体...。

 

ともかく、SessionDisconnectEventを実装。System.out.println("OK")と入れて、Tomcat側で30s、ハートビートを3秒にして試しに実行すると、30sピッタリではないが、しっかり切れた際にOKと表示される。

 

ここで現れた問題点としては、

1.Sessionの復帰処理できない。

→remember-meの有効期限を長くすれば問題なくない?(ひとまず置いておく)

 

2.下記のようにPingPong毎にそれぞれInboundChannelとOutboundChannelがスレッドに生成される。


ThreadPoolTaskSchedulerの設定かと思われるので、後日、行う。

 

 

 

社内での競プロ勉強会

二年以上前にPaizaで問題を解いていて、そこから全くのブランク。

最近は再帰処理を学習していた。

頭の中で表現方法が繋がらず、時間がかかるうえに、ガサツな解き方が多い。

まずは、基本から解いていく。

 

033 - Not Too Bright(★2)

「2*2の領域」を想像した行列に適用して考える事。エッジケース。

 

B - AcCepted

分岐多くしすぎて、漏れていたケースの発見に遅れた。

 

A - Task Scheduling Problem

タスクの並び替えはOK。コストのコードに漏れがあった。

 

コードについてレビュー頂いた点やアドバイス

・Comparatorや自前の入れ替え処理を実装する必要はない→配列ならArray().sort、Listならsort()を使用しよう

・処理をした後に、ひとまとめにして出力するのはもったいない→都度、System.out.print()等で出力。Stringのrepeat()やjoin()などで処理を簡潔に。

ラムダ式はシンプルに記述できる事があるので身に着けておくと良い。

・実行時間がかかる場合もあるので、キューやデキュー含めたアルゴリズムを身に着けておくとよい。

・自分で便利だと思うライブラリを作ろう

 

その後に進めて気付いた事

・Collectionが便利だった記憶。(なんだっけ...)

・ScannerのnextとnextLineで挙動が違う事がある(後日調べる)

・String.substring()便利。

 

感想

いつも「このままでいいのだろうか」と考えています。

ダメです。即答です。

 

列挙していくと、

・ドキュメントを読んでいても、OutboundChannelとInboundChannelのスレッドの適切な実装が思い浮かばない。

理由:ハートビート以外にもメッセージ送受信に使われるスレッドなので、送ったら終了する仕組みが良いのか、他にも繋げておくメリットがあるのか見当がつかない。スレッド管理の知識やWebSocketの知識がない。

→ドキュメントの読み進めていない部分は進める。

 

ステータスコード1008といった通信失敗時における処理の設定ができていない

→今回のDisConnectEventで実装できないか、SubProtocolWebSocketHandler関係で何か処理できるクラスがないか探す

 

最後に、「そもそも、ここまで一人で時間かけて実装する意味があるのか」という事です。これについてはYESだと思います。

私のしている事など、建築している大工さんの前で砂遊びをしている子供のようなものでしょう。正直、ただ嘲笑ものでしかないのではと思う事があります。

ただ、それでいいのです。

また、是が非でも作りたい気持ちの反面、その機会があるのか疑う心もあります。

だから、安心することなく(できず)、毎日勉強しています。作っています。

それが楽しいのです。

私は、社内の方々も数年前からお世話になっているエンジニアの方々のお話も信じておりますので、期限を設けて、必要な努力をする。置かれている状況を俯瞰して、都度、違う視点から複数の意見を伺い、疑問を解消する。

思うように進まない事も一つの結果です。そのうえで更に時間をかける価値があるかどうかは何を目的にしているかによって決めればいい。

JDBCの学習日記

動作環境

Java SE15

MySQL 8.0.25

MySQL-Connecor-J-8.0.32

 

内容

データソースおよびURL

MySQL :: MySQL Connector/J 8.0 Developer Guide

基本的にMySQLのドキュメントをメインで進める。

 

ORACLEJDBCドキュメントでJDBC XX標準サポートとあったが、

MySQL Connector/J is a JDBC Type 4 driver, implementing the JDBC 4.2 specification. 

との事。

 

もう既にインストールしていたが、手探りで無理やりだったので、1から読んでいく。

MySQLのInstalling from sourceより

  1. Place all the required third-party libraries in a the directory called lib at the root of the source tree (that is, in mysql-connector-j/lib, if you have followed the steps above), or put them elsewhere and supply the location to Ant later (see Step 5 below).

 

java - a simple question about lib folder in Eclipse - Stack Overflow

libどこ...(Eclipse)という事で、Build Pathでクラスパスにjarファイルを追加したのは間違っていなかったとわかった。

 

Class.forName()が何をしているのかは、7.1 Connecting to MySQL Using the JDBC DriverManager Interfaceにあった。

Specify to the DriverManager which JDBC drivers to try to make Connections with. The easiest way to do this is to use Class.forName() on the class that implements the java.sql.Driver interface. With MySQL Connector/J, the name of this class is com.mysql.cj.jdbc.Driver. With this method, you could use an external configuration file to supply the driver class name and driver parameters to use when connecting to a database.

 

そして、Connectionが確立されると、StatementとPreparedStatementオブジャクトを使用できると。

Statementとは...?

SQL文の実行を許可してResultSetクラスを通して結果を取得する。

 

...と読む事に傾いたので動かしていく。

 

... (パスワードなどのDB接続に必要なコードは省略)

try(
        
            Connection con = DriverManager.getConnection(URL, USER, PASS);
            Statement st = con.createStatement();    
            ){
            st.executeUpdate("INSERT INTO PERSON(ID,NAME) values (3, 'Y')");    
            ResultSet rs = st.executeQuery("SELECT * FROM person");
            
            while(rs.next()) {
                System.out.print(rs.getString(1) + " ");
                System.out.print(rs.getString(2) + " ");
            }
     
                }catch(SQLException ex) {
                    ex.printStackTrace();
                }
    

 

ここで、

  st.executeUpdate("INSERT INTO PERSON(ID,NAME) values (3, 'Y')");    
  ResultSet rs = st.executeQuery("SELECT * FROM person");

上記、2文をtryに置こうとするとSyntacs errorになる。(私のtry-with-resourcesに対する理解が足りないだけでした。)

try-with-resourcesとAutoCloseable - Qiita

 

ResultSetもConnectionもAutoCloseableを実装しているから記載できると。

BufferedReaderもReaderにCloseableが実装されている。

 

Statementについては下記記載があった。

To create a Statement instance, you call the createStatement() method on the Connection object you have retrieved using one of the DriverManager.getConnection() or DataSource.getConnection() methods described earlier.

 

日記

JDBCについては、まだまだ慣れません。ただPreparedStatementといったものを使用する理由についても学習する機会ですので、Java Gold範囲でも重点的に進めたいです。

 

今の会社に拾って頂いて、私はIT業界に飛び込もうとしている訳ですが、ここに至る経緯は17歳の春から続くもので、誰からも見向きすらされないのは当たり前でした。

そのような事情からも、自分には過度な期待はせず、ただ静かに、望むような一日を送る事を大切にしてきました。

なので、世間は「GPT-4が平均的なプログラマーよりAIの方がコードを書ける、仕事が無くなる」という話題で盛り上がっておりますが、「ああ、そうか」くらいの心地に収まります。

道半ばで終わるのも受け入れられる人生であればいいと思うので、働いて、勉強するだけです。

そのような生活の先にすら仕事がないなら実家に帰ります。それだけです。

Webjarsを使ってReactに触れる in Spring Boot

触れたというのか。

仕事後にReactチュートリアルしようとして、こんなつらい目に遭うと思わなかった日記。

 

既存のウェブサイトに React を追加する – React

Spring Secutiryを実装しているプロジェクトで使用したいので、Webjarsで探すと...

GitHub - webjars/react

 

reactjs - Import react from webjars - Stack Overflow

Reactを動かすにはReact Domが必要。(気づかず1回目ハマる)

Maven Centralで調べると18.1.0が出てくるが、ReactとReact Domはバージョンを合わせる事が推奨されている。実際に18.1.0と組み合わせると、

Cannot read properties of undefined (reading '__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED'

がでてくる。(二回目ハマる

 

Maven Central: org.webjars:react:16.5.2

 

じゃあ、HTMLにパスを書こうかと

/webjars/react-dom/16.5.2/umd/react.development.js記載も404。

C直下のフォルダにあるreact-domのファイル探したり、umdって何?developmentとproductionの違いは?server.browser.jsやserver.js、index.js...(多すぎ)の違いは?と地獄を見て、下記に行きつく。

 

/webjars/react-dom/16.5.2/umd/react-dom.production.min.js

 

react-domとreactの順序が逆で

ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.

修正して終わり。

 

無事、You liked thisを表示完了。

返答としては、疲れるけど、嫌いじゃない。

 

後日、整理していきます。

明日、お仕事なので寝ます。

バリデーションとDate、そしてバインディングできないのによくハマるお話 in Spring Boot

入力値チェックを丸々忘れていたURLがあったので、実装と有耶無耶にしないための再学習を行います。

 

まずは、チュートリアル

入門 | フォーム入力の検証

 

  • フォームに記入された属性を収集するために @Valid でマークされた personForm オブジェクト。

  • bindingResult オブジェクト。検証エラーをテストおよび取得できます。

 

上記を表示するのはこちらですね。

<td th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</td>

 

ひとまず、Binding Resultの話まで。

What is the use of BindingResult interface in spring MVC? - Stack Overflow

Binding ResultのgetFieldErrorsにFieldErrorがあり、このFieldErrorのgetDefaultMessageが表示される。このメッセージについては、validation内にmessageを設定する事で変更できます。フィールドごとに設定しなくてはいけないので少し歯がゆいです。messageSourceで管理した方が良い気もしますが、今回は直接設定してしまいます。

 

今回のモデルのフィールドは部屋名、期限、パスワード有無のフラグ、パスワードです。今回、ピックアップしたいのは、期限です。

HTMLのカレンダーから入力する形式ですが、過去の日付も選べます。

以上、設定するバリデーションとしては、①HTMLのカレンダーから選択した時の文字形式か正規表現で確認②過去の日付を選んでいないか、の2点です。

 

CustomValidationについてはこちらを参考にします。

https://www.baeldung.com/spring-mvc-custom-validator

Hibernate Validatorのドキュメントも参考にします。

https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-customconstraints

 

An annotation type is defined using the @interface keyword. All attributes of an annotation type are declared in a method-like manner. The specification of the Jakarta Bean Validation API demands, that any constraint annotation defines:

  • an attribute message that returns the default key for creating error messages in case the constraint is violated

  • an attribute groups that allows the specification of validation groups, to which this constraint belongs (see Chapter 5, Grouping constraints). This must default to an empty array of type Class<?>.

  • an attribute payload that can be used by clients of the Jakarta Bean Validation API to assign custom payload objects to a constraint. This attribute is not used by the API itself. 

@Targetについては、記載が既にありますが、下記もメモ。

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/annotation/ElementType.html

 

payloadとgroupsについては後日。

後は①、②を実装して終わりです。(投げやり)

 

Date型について

Date date1 =dateFormat.parse("2023-03-10"); 

date1.getTime()で1678374000000

 Date date2 = new Date(2023,03,10);

date2.getTime()で61639196400000

後日調べる事とします。

 

一応、フロント側でも入力を制限する事にしました。

https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/date

 

最小の日付についてはminを使いますが、変数式を使いたいのでth:min。

https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html

お手軽。ありがとうThymeleaf。

 

最後に、Binding Resultでエラーを表示するためにth:fieldに直すも

Caused by: org.attoparser.ParseException: Error during execution of processor 'org.thymeleaf.spring6.processor.SpringInputGeneralFieldTagProcessor' (template: "discussion/createRoom" - line 13, col 21)

これは、原因も忘れたので後日調べますが、@ModelAttributeでnameを指定していない時に起こります。GetでもPostでも必要です。(Spring Bootに触れ始めたころに苦しめられ、idとnameでform送信していたのを思い出しました。)

 

感想

相変わらずハマる事がありますが、入社してから生産性が上がりました。

しかし、欲を言うとHibernateのドキュメントもじっくり読み込んで理解したかった気持ちもあります。後は残りの機能を追加して単体テストで終了です。

サニタイズとエスケープ in Spring Boot

Thymeleafでエスケープ処理はされるのかという問いです。

用語整理

サニタイズ・・・意図しない動作を生んでしまう文字を無効化する

エスケープ・・・意図しない動作を生んでしまう文字を別の文字列に置き換える。

 

初めに、下記簡単なformを作り値の表示を行いました。

 

Controller

@GetMapping("/test")
    public String c(@ModelAttribute Hoge hoge) {
        return "test";
    }
    
    @PostMapping("/test")
    public String ck(@ModelAttribute Hoge hoge, Model model) {
        System.out.println(hoge.isChexckBox());
        
        model.addAttribute("test", hoge.getName());
        return "test";
    }

 

test.html

<html xmlns:th="http://www.thmeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form th:action="@{/test}" th:object="${hoge}" method=post>
        
        <input type="checkbox" th:field="*{checkBox}" value="true">
        <input type="text" id=name, name=name>
        <button>sousinn</button>
    </form>

    
     <div th:utext="${test}"></div> 
        
</body>
</html>

 

①ここで、<script>alert('aaa')</script>などと打つと、th:utextはサニタイズをしないので、左記コードが実行されてしまいます。

th:textや変数式で表示する分には実行されません。

 

②では、他のメタ文字はどうでしょうか。

例えば「\」です。

デバッグでnameの値を見ると「\\」となっています。

 

③では、HtmlUtils.escape()ではどうでしょうか。

デバッグでのエスケープ後の値は...

<script>alert('aaa')</script>は&lt;script&gt;alert(&#39;初めての脆弱性&#39;)&lt;/script&gt;

 

Viewでは...

th:utextは<script>alert('初めての脆弱性')</script>

変数式は&lt;script&gt;alert(&#39;初めての脆弱性&#39;)&lt;/script&gt;

 

「\」はデバッグだと「\\」。Viewは「\」です。

 

結論

①、②より、Thymeleaf側かSpring Boot側でエスケープ処理される文字とされていない文字がある。

③より、HtmlUtils.escape()を使用するとサニタイズしていなくてもスクリプトの実行を防げた。

 

③より、呼び出した際に、元の文字列に戻っている事から返した値をエスケープ処理せずに表示する場合は気を付ける。例えば、JavaScriptで何も対策せずに処理をする際は気を付けなくてはいけない。

 

日記

このブログは閲覧者がいるわけではないので、日々思った事を綴りたい。

昨年あたりの転職活動の際も感じていた事だが、Twitterの方々の言う「市場価値」というのが、思いのほか刺さる。

個人でWebアプリをリリースし、他にも考えている活動を通して、ゆくゆくは、そこから広げた面白い取り組みをしたいと思っているわけだが、この市場価値がない内はそもそも開発に携われないので苦しい。

 

幸いな事に、会社の方々との出会いには恵まれて、時間も、教えていただける環境もあるので実現可能とは思うが、まるで、この「市場価値=自分そのもの」のような感覚に囚われて、意味もなく焦ったり、落ち込んだりするわけだ。2月あたりは落ち込みが酷かった。

しかし、まあ、やるしかないって事です。今の会社で頑張ると決めたので、頑張るだけです。

ただひたすら修正する日記 4,5日目 in Spring Boot

日記

3月3日にようやく回線が繋がり、良い出だしは切れたのではないかと思います。

さて、現状ですが、事情が幾つか重なり、メインに個人でのWebアプリ開発、サブにJavaアルゴリズムAtCoder)を割り当てる事にしました。

具体的には、

勤務日:フレームワーク等のリファレンス読み込み、Javaの学習

午後勤務日:アルゴリズムJavaの学習

休日:Webアプリ開発、数学、Javaの学習

です。

 

今回は、login機能のテストや機能追加、データベースの不要なトークンの定期削除処理を実装しました。

 

login機能は例外のメッセージを表示する機能を統一。ログアウト時と二重ログイン時でのメッセージ追加をURLと発生する例外から行いました。

 

データベースの不要なトークンについては@Scheduleを使用しました。

 

当分の目標は、上記学習を通して、会社に貢献できる人材になる事ではないかと思います。

とは言っても、様々な事情が重なり、焦る気持ちも多いです。

「もっと気楽に生活すればいいのでは」とも思いますが、焦らない方がおかしいので慣れるまで耐えたいと思います。

Spring Batchの学習記事も書いていましたが、まだまだ使用する事はなさそうなので、下書きのままにしました。

プロJavaのテストケース・JavaGold取得を目指した日記 2日目

はじめに

何となくの理解で進めていたヒープ領域やstatic領域の話を、アウタークラスやインナークラス、ローカルクラスを通して学習する度に、身になってる心地がしていいです。

ただ、数学にしてもプログラミングにしても理解や実装するための手段であって、嬉しさに留めておかないって事に気を付けたいです。

実際、昨日の進捗と精度は悪かったので、今日は、あらかじめ調べる時間の上限を15分とします。

 

例えば、Loggingを触れた事がなくて、Java Goldの学習が止まったならば、15分で調べ上げて再度問題を解く。できなければ何分かかったか計り、スケジュールに影響がでるようなら、後回しにするという流れです。

 

今回は、Factory Methodが対象でした。

...メモした方が良さそうなところだけ残し、後は直接復習します。

 

内容

プロJava

Java Gold2章に備えて、ラムダ式復習。

 

Java Gold

・匿名クラス

①匿名クラスは、コンストラクタを定義できない。

 

static class Inner{
        public static String message;
        public void test() {
            System.out.println(message);
        }
    }

 

    public static void main(String[] args) {
        
        Inner 新Inner = new Inner() {
            
            @Override
            public void test() {
                System.out.println("上書きしました");
                System.out.println(getMessage());
            }   

   

       public String getMessage() {
                return message;
            }        
            

    
        };
        
        新Inner.test();
    }

 

ここで、super.messageとすると

static フィールド CH1_Q8.Inner.message には static にアクセスする必要があります

と警告がでる。

②これは、本来、superはオーバーライドされたメソッドのあるクラスを参照するので、staticを参照するならInner.messageかmessageで直接参照すればいいのでは?って意味でしょうか

 

・interfaceからdefaultメソッドを呼び出す際の話

複数のinterfaceを実現し、且つ、同名のdefaultメソッド実装した場合は、直接実現しているinterfaceがsuperで呼び出す事ができる。

 

それ以外のinterfaceから呼びだそうとすると、下記エラーがでる。

Illegal reference to super type CH1_Q11.C, cannot bypass the more specific direct super type com.example.demo.javaGold.CH1_Q11$D

 

・実現元のinterfaceと継承元のクラスに同名のメソッドがあった場合は、継承元のクラスが優先される。

 

 

・interface内でprivateでのメソッド宣言はできるが、interface内での利用を想定しているため本文が必要

 

 private default void ts() {
        }

 

Illegal combination of modifiers for the private interface method ts; additionally only one of static and strictfp is permitted

 

Enumのvalues()ってどこにドキュメントあるのだろう...と思っていたらAPIドキュメントにはないとの記載が...そんな事もあるのですね。

 

他、学習用のクラスにコメントアウトし記載。Java Goldは私の知識不足で解けない事が多いため、TCP/IP同様に特にブログへの記載をせずに学習する方針に切り替えたい。

 

感想

JUnitを早く触れたいです。

7日から触れられるといいなと思います。

光回線契約や一人暮らしの家具購入等でいっぱいでしたが、もっとできるので進めたいと思います。