エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

Java14事前調査まとめ(言語・JVM系)

調査結果

suzaku-tec.hatenadiary.jp

suzaku-tec.hatenadiary.jp

suzaku-tec.hatenadiary.jp

他にもJEP 368: Text Blocks (Second Preview)JEP 361: Switch Expressions (Standard)があるけど、大きな仕様変更は内容だったので、jdk14の調査としてはスルー

APIGC系は、Java外の知識がかなり必要になってくるため、スルーした。
FlightRecoderとかGCは、手がつけにくい。。。

感想

java14とかで検索すると、java 1.4 の情報が出てくるのに、思わずニヤリとしてしまいましたわ。。。
調査していて思うのは、周辺知識がないと、GCやらAPIは、理解しづらいと思った。
僕の頭のメモリだと、言語とJVMで満杯です。。。

バージョン違いでビルドできないってのにハマってしまったのが痛かった。。。
early accessの入手ルートは、sdkmanが一番楽そう。

参考サイト

Java 14新機能まとめ - Qiita

Head toward Java 13 and Java 14 #jjug

Java14事前調査 JEP 305: Pattern Matching for instanceof (Preview)

環境

$ java -version
openjdk version "14-ea" 2020-03-17
OpenJDK Runtime Environment (build 14-ea+34-1452)
OpenJDK 64-Bit Server VM (build 14-ea+34-1452, mixed mode, sharing)
$ VER
Microsoft Windows [Version 10.0.18362.592]

JDK14

JDK 14

JEP 305: Pattern Matching for instanceof (Preview)

JEP 305: Pattern Matching for instanceof (Preview)

概要(超要約)

instanceof で型チェックする際に、型変換も同時にするようにしたよ。

なぜ入ったのか

今までの実装だと、下記のように String s = (String) obj; するケースが多かったと思う。

if (obj instanceof String) {
    String s = (String) obj;
    // use s
}

instanceof を使う場合、高確率でこういう使い方をやり、コードが煩雑になっていくことがある。
ダウンキャストがある状態は、参照してはいけない変数やメソッドが参照できるようになるので、あまりよろしくない。

テストコード

public class JEP305 {

  public static void main(String[] args) {
    Object obj = "hello saga!";
    
    if (obj instanceof String s) {
      System.out.println(s.length());
    } else {
      System.out.println("not String");
    }
  }
}

とりあえず、安定のhello sagaで。

実行

$ javac --enable-preview -source 14 JEP305.java 
$ java --enable-preview JEP305
11

変換したString型として使用できているのが分かる。

感想

もっと早く導入されていても良さそうが気がした対応では?と心のなかで感じた。

Java14事前調査 JEP 359: Records (Preview)

環境

$ java -version
openjdk version "14-ea" 2020-03-17
OpenJDK Runtime Environment (build 14-ea+34-1452)
OpenJDK 64-Bit Server VM (build 14-ea+34-1452, mixed mode, sharing)

eary accessのページからダウンロードしたやつだと、recordsがまだ入ってないやつっぽい。。。
recordsを試すなら、sdkmanから最新のバージョンを落としてくるのが良さげ。

JDK 14 Release Candidate Builds

それに気づくのにだいぶ遅れて、少し前のバージョンでビルドが通らずに四苦八苦してた。。。

$ VER
Microsoft Windows [Version 10.0.18362.592]

JDK14

JDK 14

JEP 359: Records (Preview)

JEP 359: Records (Preview)

概要(超要約)

データ保持用のクラス定義方法を追加
かなり乱暴に言うと、構造体みたいなものを追加した感じ。

テストコード

public class JEP359 {

  public static void main(String[] args) {
    Range record = new Range(3, 10);
    System.out.println(record);
  }

}

record Range(int lo, int hi) {
  public Range {
    if (lo > hi)  /* referring here to the implicit constructor parameters */
      throw new IllegalArgumentException(String.format("(%d,%d)", lo, hi));
  }
}

JEP359にあるサンプルを流用。

実行

$ javac --enable-preview -source 14 JEP359.java 
$ java --enable-preview JEP359
Range[lo=3, hi=10]

想定通りの結果。

追加補足

public class JEP359 {

  public static void main(String[] args) {
    Range record = new Range(3, 10);
    System.out.println(record);
    System.out.println(record.lo());
  }
}

生成されたインスタンスの値を取得したい場合、record.lo()のようにアクセスする。
個人的には、プロパティ的な立ち位置なので、record.loでアクセスしたい。。。

IllegalArgumentExceptionを起こすテストコード

public class JEP359 {

  public static void main(String[] args) {
    Range record = new Range(3, 1);
    System.out.println(record);
  }
}

record Range(int lo, int hi) {
  public Range {
    if (lo > hi)  /* referring here to the implicit constructor parameters */
      throw new IllegalArgumentException(String.format("(%d,%d)", lo, hi));
  }
}

実行

$ javac --enable-preview -source 14 JEP359.java 
$ java --enable-preview JEP359
Exception in thread "main" java.lang.IllegalArgumentException: (3,1)
        at Range.<init>(JEP359.java:15)
        at JEP359.main(JEP359.java:5)

補足

  public Range {
    if (lo > hi)  /* referring here to the implicit constructor parameters */
      throw new IllegalArgumentException(String.format("(%d,%d)", lo, hi));
  }

上記部分がコンストラクタのような動きをする。
これがあることで、不安定状態(値の整合性が取れてない)のインスタンスが作れないようにできる。

感想

変数へのアクセス方法が、個人的に不満
役割が明確なら、メソッドアクセスじゃなく、変数アクセスっぽいほうが好き。

無駄にコード量が増えるのを抑制できるのは、評価したい。

2020/02/03週 気づきと振り返り

業務こなしての問題・気づき

根を詰めすぎは良くない

バグの原因が分からなくて、かなり残業してしまった日があったが、翌日に出社したら、あっさり解決してしまった。。。
根を詰めるのは否定しないが、見えるものが見えてないときがあることを自覚する必要がある。

自己を過信するのは良くないが、自分の状態を知っておくことも、大切だと思った。

バグの原因が、クロージャの循環参照によるメモリリークで、コンソール上のログ見ただけだと、原因が全くわからないのは、きつかったわ。。。
単純そうだけど、作り込みの段階で気づきたかった。。。

[Swift] 画面間の値渡し

画面間の値渡しが、かなり苦痛なのだが、いい方法ないものだろうか。
よくやるのは、prepareで遷移先の画面のインスタンスに値を入れ込むのだが、その変数の公開範囲が広すぎて問題になるのでは?って、いっつも思う。

雑記

今週は精神不安定だったわ。。。
バグが解消できない状態って、かなり精神的にキツイ。。
今週は、たぶんハゲ化が進行した気がする。
ポケモンのランクまで負けまくったのも、ハゲ化を助長してそう。

2019年の振り返りと今後のブログ運営

振り返り

買ってよかったもの

任天堂 Nintendo ポケットモンスター シールド [Nintendo Switchソフト]

ブラック・ホワイト以降、ポケモンからは離れていたが、久しぶりに買って見てものすごくハマった。
ランクマやってると、永遠に時間が潰せそうな気がする。
お気に入りは、トゲキッス
こいつのおかげで勝てた試合が結構ある。あと、サザンドラとか。

個人的には、一部リストラは、肯定的に見てる。
無限にメモリにデータを詰め込めるわけじゃないから、いつか限界は来る。
新しいことにできなくなって、衰退していくだけだから、苦渋の決断だとは思うが、いい結果になると個人的には感じる。
追加コンテンツ方式採用も、評価してる。
環境調整のタイミングが短い周期になるのと、追加発売で同じようなストーリーをやらされるより、新しい冒険が加わる方が、楽しめると思う。

2020年は、ポケモンにどっぷり浸かりそう。

アップル Apple MUUQ2J/A [iPad Air 10.5インチ Wi-Fi 256GB スペースグレイ]

電子書籍ように購入。
Fireタブレットにしようかと思ったが、プライム会員じゃないので選択肢から外した。

電子書籍以外にも、ポケモンのダメージ計算とかによく使うかな?
画面も大きいから、操作しやすい。

PHILIPS フィリップス 436M6VBPAB/11 [液晶ディスプレイ 42.5型/MVA/4K対応/5年間フル保証/HDR1000]

ゲーム用のディスプレイとして購入。
ついでにテレビを捨てた。

遅延ないし、画面が大きくてきれいなのがいい。
ただ、音量調節ができないのが、ダメだわ。
安物のスピーカーで対応できるようにした。
全体的にみると満足なんだが、音量調節できないのは不満だ。

ブログ運営について

週次に書くように心がけたが、踏み込んだが記事が書けなくなってしまったと感じる。 月末に深堀り記事を書くようにしたほうがいいかもしれない。

雑記

去年のうちにやっとけよって思うが、ポケモンにハマってしまって、なかなか手がつかなかった。。。

願望

副業がしたいって、最近思うようになってきた。
子ども向けのワン・オン・ワンに近いプログラミング塾って需要あるかな?

2020/01/27週 気づきと振り返り

業務こなしての問題・気づき

【Swift】'weak' cannot be applied to non-class type ~ の対応

protocol A{}

weak var myValue: A?

delegateがclassプロトコルに準拠してない場合に発生する。
なぜエラーになるのかは、調べたけどよく分からなかった。。。

【Swift】位置調整はUIEdgeInsets

キーボード出したときに、場所を変えたいときとかのビューの位置調整に使う。

雑記

情報処理技術者試験データベーススペシャリストに申し込んだ。
午前免除が切れてしまったから、全部受けなければならない。
そろそろマジで合格しないとダメだな~とは感じているのだが、世間的にはどれだけのステータスになるんだろうか?

Java11のオラクル試験が出てきたけど、移行試験の対策本って出てるのかな?
資格対策は、電子書籍じゃなくて実物の本が欲しいのだが、書店探してもないんだよね。。。
売られてないのかな?

今週は引きこもってた。
土日は、家でポケモンのランクマしてた。
勝率5割の壁が厚い。
なかなか5割突破ではない。
ブリムオンへの入れ替えマジックミラーで、やどりぎのタネ、ステロが跳ね返されて負けるのが、すごいストレスが溜まったわ。
あと、カバルドンの対オーロンゲ対面で、ステロ読まれて挑発とかもストレス溜まる。
逆に、相手のダイマエースを潰したときは、マジで快感。

Java14事前調査 JEP 358: Helpful NullPointerExceptions

きっかけ

そろそろJava14のリリース時期が近づいて来たので、調査。

ボリュームが多そうなので、とりあえず1個ずつ記事にまとめる。
全部一辺にやろうと思ったけど、ダレちゃいそうなので辞めた。。。

環境

$ java -version
openjdk version "14-ea" 2020-03-17
OpenJDK Runtime Environment (build 14-ea+24-1107)
OpenJDK 64-Bit Server VM (build 14-ea+24-1107, mixed mode, sharing)
$ VER
Microsoft Windows [Version 10.0.18362.592]

JDK14

JDK 14

JEP358

JEP 358: Helpful NullPointerExceptions

概要(超要約)

ヌルポのメッセージを分かりやすくしたよ

テストコード

public class JEP358 {
  public static void main(String[] args) {
    String msg = null;

    System.out.println(msg.length());
  }
}

13での実行結果

実行時にフラグ(-XX:+ShowCodeDetailsInExceptionMessages)を立てないと、以前と同じような出力になるそうなので、フラグを立てないで実行してみる。

$ javac --enable-preview -source 14 JEP358.java
$ java --enable-preview JEP358
Exception in thread "main" java.lang.NullPointerException
        at JEP358.main(JEP358.java:5)

分かるのは、5行目でヌルポになるってことだけ。
情報量が少ないため、下手するとコード読んでも分からない可能性がある。
開発者だと、そういうケースによく会うと思う。
自分も、たまにヌルポ沼にハマって抜け出せない事がある。

14での実行結果

$ javac --enable-preview -source 14 JEP358.java
$ java --enable-preview -XX:+ShowCodeDetailsInExceptionMessages JEP358
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "<local1>" is null
        at JEP358.main(JEP358.java:5)

5行目の"String.length()"を使ってるところでエラーになったってのが分かる。

2020/02/09 追記

$ javac -g -source 14 JEP358.java
$ java --enable-preview -XX:+ShowCodeDetailsInExceptionM
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "msg" is null
        at JEP358.main(JEP358.java:5)

上記の通り、コンパイル時に-gを付与することで、実行時にどの変数がnullで落ちたのか分かるようになる。
-gを付与することでデバック情報が付与されたクラスファイルができるらしい。

javac - Java プログラミング言語コンパイラ

感想

ヌルポには頭を悩ませることが多々あったので、この提案はすぐに入ってほしい。
そして、Java使ってる現場は、なるはやでこのバージョンに上げてほしい。
多くの開発者がハゲるのを防止してくれると思う。