問題タブ [final]
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 - シリアル化および不変オブジェクト
不変の使用を目的としたクラスがあるため、すべてのフィールドにラベルを付けたいと思いますfinal
。
ただし、クラスはシリアル化および逆シリアル化されて、ネットワーク経由で送信されます。これが機能するには、空のコンストラクターが必要です。これにより、最終フィールドを作成できなくなります。
これはかなり一般的な問題だと思いますが、解決策が見つかりません。どうすればいいですか?
java - 配列リストの最終宣言
final arraylist() を宣言したとき、その arraylist で挿入、検索、および更新操作を実行できるかどうか。
java - インポートされた Java クラスの public static final 変数
たまたま職場で Java コードに出くわしました。シナリオは次のとおりです。 と の 2 つのクラスがありClassA
ますClassB
。
ClassA
内部には 4 つの public static final 文字列値以外は何もありません。その目的は、これらの値を次のように使用することですClassA.variable
(理由は聞かないでください。これは私のコードではありません)。
ClassB
輸入品ClassA
。文字列値を編集しClassA
てコンパイルしました。実行するとClassB
、新しい値ではなく、古い値が使用されていることがわかりました。ClassB
からの新しい値を使用するように再コンパイルする必要がありましたClassA
。(インポートする他のクラスを再コンパイルする必要がありましたClassA
!)
これは単に JDK 1.6 のせいなのか、それとも以前に再コンパイルすることを知っていたはずClassB
です! 私を啓発します。:)
java - 最終メソッドはインライン化されていますか?
Javaの最終メソッドは自動的にインライン化されますか?
多くの本はイエスと言っています 多くの本はノーと言っています!!!
java - Javaの派生クラスのコンストラクター内で基本クラスの最終変数を割り当てるにはどうすればよいですか?
Color
このような基本クラスがあります。このクラスは不変になるように設計されているため、結果にはfinal
修飾子があり、setter はありません。
このクラスから派生したクラスは、クラスのゲッターColorHSL
を提供することに加えて、色相、彩度、明度で構築されます。Color
これは、物事が機能しなくなる場所です。
のコンストラクターは、いくつかの計算を行ってから、 、、およびColorHSL
の値を設定する必要があります。ただし、スーパー コンストラクターは、計算を行う前に呼び出す必要があります。そのため、パラメーターなしのコンストラクターが導入され、最後の 、、およびを後で設定できるようになりました。ただし、パラメーターなしのコンストラクターも設定も (初めて、 のコンストラクター内で) Java コンパイラーによって受け入れられません。_r
_b
_g
Color()
_r
_b
_g
ColorHSL
この問題を回避する方法はありますか、または、、およびfinal
から修飾子を削除する必要がありますか?_r
_b
_g
編集:
Color
最終的に、RGB データと HSL データの両方を含む基本抽象クラスを使用することにしました。基本クラス:
とのクラスはRGBColor
からHSLColor
派生し、とのメンバーColor
を初期化する単純なコンストラクターを実装します。(はい、基本クラスに派生クラスの静的インスタンスが含まれている場合)RGBValues
HSLValues
java - 最終的な静的メソッドの動作
私は静的メソッドでモディファイアをいじっていて、奇妙な振る舞いに出くわしました。
ご存知のように、静的メソッドはインスタンスではなくクラスに関連付けられているため、オーバーライドできません。
したがって、以下のスニペットがある場合は、正常にコンパイルされます
しかし、クラスAの静的メソッドにfinal修飾子を含めると、コンパイルが失敗し ます。Bのts()はAのts()をオーバーライドできません。オーバーライドされたメソッドは静的finalです。
静的メソッドをまったくオーバーライドできないのに、なぜこれが発生するのですか?
java - Javaのコンストラクターからプライベートfinalメンバー変数を宣言して設定する適切な方法は?
コンストラクターからメンバー変数を設定するには、さまざまな方法があります。私は実際に、最終的なメンバー変数、具体的にはヘルパークラスによってエントリがロードされるマップを適切に設定する方法について議論しています。
上記の例では、ヘルパークラスは次のようになります。
私の考えでは、コンストラクターでそのような変数を設定するメソッドを使用する方が良い方法です。したがって、Baseクラスは次のようになります。
しかし、現在、最終修飾子を維持できず、コンパイラエラーが発生します(最終変数を設定できません)
これを行う別の方法は次のとおりです。
ただし、この場合、Helperクラスのメソッドは次のように変更されます。
違いは、どこで新しいマップを作成するnew HashMap<String, Command>();
かです。私の主な質問は、機能の一部がこのヘルパーの静的メソッドからのものであり、実際のマップにエントリをロードする方法として、これを行うための推奨される方法があるかどうかです。
BaseクラスまたはHelperクラスで新しいマップを作成しますか?どちらの場合も、ヘルパーが実際の読み込みを行い、具体的なコマンドを保持しているマップへのBaseの参照は非公開で最終的なものになります。
私が検討しているオプション以外に、これを行うためのよりエレガントな方法はおそらく他にありますか?
java - Java:なぜこのメソッドに副作用があるのですか?
特定の変数がマークされているにもかかわらず、副作用を生成しているメソッドがありますfinal
。どうしてこれなの?おそらく私は何をするのか混乱してfinal
います。
java - 最終クラスのサブクラス化。または、DegenerateDecorator
同じ種類のオブジェクトのさまざまな表現があります。それをモノと呼びましょう。「Thing」はマーカーインターフェイスです。ThingFormat0、ThingFormat1、ThingFormat2などはすべてThingを実装するJavaBeansです。(JavaBeansであるため、JSONマーシャラーは自動的にJSONとの間で変換します。)ThingFormat1には、nameやidなどのメンバーがいくつかあります。ThingFormat2には、他のものへのURIリンクがあります。ThingFormat3には、他のものなどのThingFormat1表現があります。
JSONシリアライザーは、URIを自動的に変換する方法を知っています。(toString()とコンストラクターClassName(String string)を使用して変換できるすべてのクラスで機能します。)
URIのように動作するが、マーカーインターフェイスThingを実装するThingFormat0が必要です。
URIは最終クラスであり、サブクラス化できないため、これは機能しません。
これを行うために私が考えることができる唯一の方法は、デコレータ(URIに機能を追加しないため、非常に縮退した種類のデコレータ)を作成することです。これは、一部の「ダックタイピング」言語では簡単ですが、Javaでは、URIをラップして、必要なURIのすべてのメソッドを実装する必要があるため、より面倒です。もっと簡単な方法はありますか?
java - チェックされた例外をスローする静的な最終フィールド初期化子を処理する方法
static final
チェックされた例外をスローするように宣言されたイニシャライザステートメントを使用してフィールドを宣言したいというユースケースに直面しています。通常、次のようになります。
私がここで抱えている問題は、ObjectName
コンストラクターがさまざまなチェック済み例外をスローする可能性があることです。これは私が気にしないためです(私の名前が有効であることがわかっているため、そうでない場合に惨めにクラッシュしても問題ありません)。Javaコンパイラでは、これを無視することはできません(これはチェックされた例外であるため)。また、次のことに頼りたくありません。
静的ブロックは本当に、本当に読みにくいからです。誰かがこのケースを素敵でクリーンな方法で処理する方法について提案がありますか?