goo blog サービス終了のお知らせ 

ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Java15 シールクラス

2020-11-08 15:11:48 | PG(Java)

Java15のプレビュー版の機能であるsealed classをメモ。

sealed classの訳語は、個人的には「封印クラス」(skrbさん辺りがそういうアイデアを出していたような気がする)を推したいが、
javacのエラーメッセージでは「シール・クラス」になっているので、「シールクラス」にしておいた。

なお、直接的な読み方を片仮名化した「シールドクラス」は、シールドというとshield(盾)を思い浮かべてしまうので、使わない方が良いと思う。


Java8 レシーバーパラメーター

2020-06-24 18:00:32 | PG(Java)

本日の話題:https://twitter.com/nagise/status/1275684711390679040

メソッドの引数にthisが指定されているけど何?という話。
聞き覚えがあるような無いような気がしたけど、自分のページには記載が無かったのできっと知らなかったのだろう^^;というわけで追加した。→レシーバーパラメーター

ググってみると、megascusさんのブログが引っかかった。さすがやで。
アノテーションを付けるための仕組みらしい。ラムダ式のvarもそのために追加されたんだったなぁ。

いまいちぴんと来ないけど、RIP Tutorialというサイトによると、内部クラスのコンストラクターの(暗黙の)引数である親クラスインスタンスに対しても同様の指定が出来るらしい。
(これと整合性を合わせるために、メソッドの引数でもthisを指定できるようにしたのではないかなーという気がする)
こちらなら、まだアノテーションを付けたい場合がありそうな気がしないでもない。

ちなみにこのサイトの例は間違ってるみたいで、親クラスのthisを指定するコンストラクターは
Inner(Outer Outer.this)
のように親クラス名でthisを修飾しないといけないみたい。


メソッド参照とジェネリクス

2020-06-10 22:33:15 | PG(Java)

https://twitter.com/RayStark77/status/1270436862142763008
https://twitter.com/mike_neck/status/1270499714111115264

メソッド参照で、そのメソッドの引数違いが定義されている(要するにオーバーロードされている)ときにエラーになるという話があった。
メソッドの引数の個数が違うならちゃんと一意に決まるから大丈夫なはず…と思って試してみたら、Function<String, Integer>のように型引数にクラスが指定されている場合は大丈夫だったけど、<A, B> Function<A, B>のように決まっていない場合は駄目らしい。

どうもメソッド参照の曖昧さ解決の問題というより、ジェネリクスの型推論が上手くいっていない雰囲気だけど。
それとは別に、そもそもFunctionには引数が1つのメソッドしか渡せないんだから、引数が2つの同名メソッドが定義されていても無視してくれていい気がする。


Javaのソースディレクトリーとパッケージの対応付け

2020-05-29 21:57:06 | PG(Java)

今日、Javaのパッケージに関する話題がTwitter上で出ていた。

Javaのソースファイル(javaファイル)を置くディレクトリー構成とパッケージ構成は一致している必要は無いんだけど、よくその必要があると誤解されている。
Javaのclassファイルのディレクトリー構成とパッケージ構成は一致している必要がある。

と思っていたら、javacの-sourcepathで指定するソースディレクトリーでは、パッケージ構成と一致している必要があるそうだ。(→phenanさんのツイート・backpaper0さんのjavacの-sourcepathを試す
JDK1.5のドキュメントにもそう書いてあった。
これは知らなかった…。

Eclipseとかのツールでソースファイルの場所とパッケージ構成が一致してないとエラーになるのが誤解を招いて良くないと思ってたけど、Eclipseが-sourcepath相当の挙動なのであれば、実は正しいのかもしれない。


Java14を試してみた

2020-03-21 18:28:57 | PG(Java)

2020/3/17にJava14が出たので、ちょっと試してみた
ほとんどはきしださんのブログを見た方が手っ取り早いw

  • switch式が正式版になった。
  • NullPointerExceptionのメッセージ改善。
    • ローカル変数名を出そうと思ったらコンパイルオプションも付ける必要がある。
  • レコード(プレビュー版)
    • 標準コンストラクターの構文にちょっとびっくり^^;
  • instanceofのパターンマッチング(プレビュー版)
    • 否定演算子とか&&とか条件演算子でも使えるの超優秀。早く正式版に欲しい!
  • テキストブロック(プレビュー版)
    • 行継続とか空白の明示とかが追加された。これはこれで便利かも。
  • PreviewFeatureというアノテーションが追加になってた。
    • Java13でプレビューとしてStringに追加されたメソッドはDeprecatedアノテーションが付いてたんだけど、PreviewFeatureに置き換わってた。
  • Serialというアノテーションが追加されてた。
    • Serializableインターフェースの代わりになるものかな?!と思ったんだけど、全然違ってた。。
  • PrintStream#write(byte[])
    • 新規メソッドだけど、中身は親クラスのものと全く同じ。Javadocは違ったので、Javadocを書くために追加したんだろうか…?
  • PrintStream#writeBytes(byte[])
    • 新規メソッド
  • StrictMath.incrementExact()等
    • Mathクラスに同名メソッドが有り、それを呼んでいるだけ。Mathと合わせる為に追加したんだろうか?