こんにちは。
仕事で argo-workflows を使っていますが、いくつか不満点があります。 argoproj-labs が提供する Hera はその不満点を解消できそうな気がしたので、少しだけ試してみました。
続きを読むこんにちは。
仕事で argo-workflows を使っていますが、いくつか不満点があります。 argoproj-labs が提供する Hera はその不満点を解消できそうな気がしたので、少しだけ試してみました。
続きを読むgit add コマンドを実行した際に clean フィルターが実行され、その標準出力へが git オブジェクトになるgit clone を実行した際に git オブジェクトに smudge フィルターが実行され、その標準出力がローカルのファイルになる.gitattributes ファイルにて指定され、フィルターの内容は .git/config で指定される表題の通り Java 23 がリリースされたそうなので println だけで文字列を表示できるようになったかを確認してみた。
System.out を使わずとも println だけで標準出力に文字を出力できる。java.base モジュールが自動でモジュールインポートされるので、 List などのコレクションクラスを使うのに import java.util.List を書かなくても良い。java コマンドから直接実行できないので、 javac によるコンパイルが必要である。
println だけで文字列を表示できるようになったのと関係のある JEP は JEP 477: Implicitly Declared Classes and Instance Main Methods (Third Preview)
というわけで、次のようなクラスを作って実行します。なお、 Preview 機能なので、 --enable-preview の指定が必要です。
void main() { println("Java23"); }
この println メソッドは java.io.IO クラスの println メソッドで、 implicitly declared class (暗黙に定義されたクラス)(つまりクラス class Foo {} ブロックがないクラス/JEP445,[JEP463https://openjdk.org/jeps/463]) の場合に自動でインポートされるメソッドであるとのこと。
すると、 class ブロックで囲まれた場合には使えないのか気になってくる。そこで次のようなクラスを作ってコンパイル・実行してみる。
class ExplicitClass { void main() { println("explicit"); } }

println メソッドが見つからず、コンパイルエラーになる。したがって、 class を作って main メソッドを定義するタイプの Java ファイルでは println は使えないようだ。
また、同様に package が宣言されている場合は implicitly declared class になれないので、 class などのクラス宣言、あるいは interface などのインターフェース宣言が必要となるため、 println は使えない。
package pkg; void main() { println("foo"); }

JEP477 の隣の JEP である JEP476 Module Import Declarations (Preview) との関連で、 implicitly declared class の場合には、デフォルトで java.base モジュールがインポートされているとのこと。そこで次のプログラムを書いて実行してみる。
void main() { var now = OffsetDateTime.now(ZoneId.of("Asia/Tokyo")); println(now.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); }

コンパイル、実行共に成功している。
ここまで、 javac してから実行しているが、javac をすっ飛ばして java でも実行できるはずなので、やってみると…


--release オプションの扱いにてエラーが発生する。
したがって、 version 23 においては、 java コマンドでの implicitly declared class は利用できない。