Java15のプレビュー版の機能であるsealed classをメモ。
sealed classの訳語は、個人的には「封印クラス」(skrbさん辺りがそういうアイデアを出していたような気がする)を推したいが、
javacのエラーメッセージでは「シール・クラス」になっているので、「シールクラス」にしておいた。
なお、直接的な読み方を片仮名化した「シールドクラス」は、シールドというとshield(盾)を思い浮かべてしまうので、使わない方が良いと思う。
Java15のプレビュー版の機能であるsealed classをメモ。
sealed classの訳語は、個人的には「封印クラス」(skrbさん辺りがそういうアイデアを出していたような気がする)を推したいが、
javacのエラーメッセージでは「シール・クラス」になっているので、「シールクラス」にしておいた。
なお、直接的な読み方を片仮名化した「シールドクラス」は、シールドというとshield(盾)を思い浮かべてしまうので、使わない方が良いと思う。
本日の話題:https://twitter.com/nagise/status/1275684711390679040
メソッドの引数にthisが指定されているけど何?という話。
聞き覚えがあるような無いような気がしたけど、自分のページには記載が無かったのできっと知らなかったのだろう^^;というわけで追加した。→レシーバーパラメーター
ググってみると、megascusさんのブログが引っかかった。さすがやで。
アノテーションを付けるための仕組みらしい。ラムダ式のvarもそのために追加されたんだったなぁ。
いまいちぴんと来ないけど、RIP Tutorialというサイトによると、内部クラスのコンストラクターの(暗黙の)引数である親クラスインスタンスに対しても同様の指定が出来るらしい。
(これと整合性を合わせるために、メソッドの引数でもthisを指定できるようにしたのではないかなーという気がする)
こちらなら、まだアノテーションを付けたい場合がありそうな気がしないでもない。
ちなみにこのサイトの例は間違ってるみたいで、親クラスのthisを指定するコンストラクターはInner(Outer Outer.this)
のように親クラス名でthisを修飾しないといけないみたい。
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のパッケージに関する話題がTwitter上で出ていた。
Javaのソースファイル(javaファイル)を置くディレクトリー構成とパッケージ構成は一致している必要は無いんだけど、よくその必要があると誤解されている。
Javaのclassファイルのディレクトリー構成とパッケージ構成は一致している必要がある。
と思っていたら、javacの-sourcepathで指定するソースディレクトリーでは、パッケージ構成と一致している必要があるそうだ。(→phenanさんのツイート・backpaper0さんのjavacの-sourcepathを試す)
JDK1.5のドキュメントにもそう書いてあった。
これは知らなかった…。
Eclipseとかのツールでソースファイルの場所とパッケージ構成が一致してないとエラーになるのが誤解を招いて良くないと思ってたけど、Eclipseが-sourcepath相当の挙動なのであれば、実は正しいのかもしれない。
2020/3/17にJava14が出たので、ちょっと試してみた。
ほとんどはきしださんのブログを見た方が手っ取り早いw