問題タブ [java-16]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java レコードの標準コンストラクターが、レコード レベルよりも制限的なアクセスを持たないのはなぜですか?
特定のタイプのレコード インスタンスを、同じパッケージ内の別のクラスのファクトリ メソッドを使用してのみ作成できるようにしたい状況があります。その理由は、レコードを作成する前に、かなりの量の検証を実行する必要があるためです。
レコードは、検証されたフィールドのダム データ キャリアになることを意図していますが、実際に検証を実行するにはいくつかの精巧なバリデーター オブジェクトにアクセスする必要があるため、レコードのコンストラクターで検証を行うことはできません。
バリデータ オブジェクトをレコード コンストラクターに渡すことは、それらがレコード状態の一部を形成することを意味するため、レコード コンストラクターを使用してレコードの検証を実行できないことを意味します。
そこで、検証を独自のファクトリに抽出し、次のようなコードを作成しました (ファクトリ クラスと同じパッケージ内のレコード)。
なんらかの理由で、上記はIntelliJの不平では機能しません:
通常のクラス (単一のパッケージ プライベート コンストラクターを許可する) を使用することで問題を回避できますが、データをレコードとしてより正確にモデル化したいと考えています。
この制限がレコードに存在するのはなぜですか? 今後、この制限を撤廃する予定はありますか?
java - Java 16 の Stream.toList() と Stream.collect(Collectors.toList()) の違いは?
JDK 16 には、インスタンスtoList()
に直接メソッドStream
が含まれるようになりました。以前の Java バージョンでは、常にcollect
メソッドを使用してCollector
インスタンスを提供する必要がありました。
新しい方法では、入力する文字数が明らかに少なくなります。どちらの方法も交換可能ですか、それとも注意すべき微妙な違いはありますか?
(この質問は、Stream.toList() が Collectors.toList() よりも優れたパフォーマンスを発揮するかどうかに似ていますが、パフォーマンスではなく(のみ)動作に焦点を当てています。)
java - Java 16 で IndexOutOfBoundsException に長いインデックスを持つコンストラクターがパラメーターとして含まれるようになったのはなぜですか?
JDK 16 でのIndexOutOfBoundsExceptionの実装をチェックしていたところ、long
インデックスを持つ新しいコンストラクターが導入されていることに気付きました。
私の知る限り、配列インデックスは通常int
値であり、これは言語仕様セクション §10.4で確認されています。
int
配列は値でインデックス付けする必要があります。short
、byte
、またはchar
値は、単項数値昇格 (§5.6) を受けて値になるため、インデックス値としても使用できint
ます。
long
インデックス値を使用して配列コンポーネントにアクセスしようとすると、コンパイル エラーが発生します。
long
このインデックスコンストラクターがいつ(そしてなぜ)使用されるのか考えていますか?