次のようなコードを宣言したコードを見つけました private final static String API_RTN_SUCCESS = "0"; private final static String API_RTN_ERROR = "1"; public static final String SHARED_PREFERENCE_CONFIG = "shared_preference_config"; public static final String STARTUP_SETTING_KEY = "startup_setting"; それらの違いは何ですか?それらは同じですか?またはそれはのために異なりますprivateかpublic?
Javaクラスでは、メソッドをとして定義してfinal、このメソッドがオーバーライドされないようにすることができます。 public class Thingy { public Thingy() { ... } public int operationA() {...} /** this method does @return That and is final. */ public final int getThat() { ...} } それは明らかであり、偶発的な上書きやパフォーマンスから保護するのに役立つかもしれませんが、それは私の質問ではありません。 私の質問は次のとおりです。OOPの観点から、メソッドを定義することによりfinal、クラス設計者はこのメソッドが常に説明どおりまたは暗黙のうちに機能することを約束することを理解しました。しかし、メソッドが何をしているかが単にプロパティを提供するよりも複雑である場合、これは多くの場合、クラスの作成者の影響の外にある可能性があります。 構文上の制約は私には明らかですが、OOPの意味にはどのような意味がありますか?finalこの意味で、ほとんどのクラス作成者は正しく使用していますか? finalメソッドはどのような「契約」を約束しますか?
私は静的メソッドを使用してモディファイヤをいじっており、奇妙な動作に遭遇しました。 ご存知のように、静的メソッドはインスタンスではなくクラスに関連付けられているため、オーバーライドできません。 だから私が以下のスニペットを持っているなら、それはうまくコンパイルします //Snippet 1 - Compiles fine public class A { static void ts() { } } class B extends A { static void ts() { } } しかし、クラスAの静的メソッドにfinal修飾子を含めると、コンパイルが失敗し 、Bのts()はAのts()をオーバーライドできません。オーバーライドされたメソッドはstatic finalです。 静的メソッドをまったくオーバーライドできないときになぜこれが起こるのですか?
これまでのところ、実質的にfinalとfinalはほぼ同等であり、JLSは、実際の動作が同一でなくても、それらを同様に扱うと思いました。それから私はこの不自然なシナリオを見つけました: final int a = 97; System.out.println(true ? a : 'c'); // outputs a // versus int a = 97; System.out.println(true ? a : 'c'); // outputs 97 どうやら、JLSはここで2つの間に重要な違いをもたらし、その理由はわかりません。 私は次のような他のスレッドを読みました 最終と事実上最終の違い 事実上最終変数と最終変数 「事実上最終的」である変数はどういう意味ですか? しかし、それらはそのような詳細には入りません。結局のところ、より広いレベルでは、それらはほとんど同等であるように見えます。しかし、深く掘り下げると、明らかに異なります。 この動作の原因は何ですか?誰かがこれを説明するいくつかのJLS定義を提供できますか? 編集:私は別の関連するシナリオを見つけました: final String a = "a"; System.out.println(a + "b" == "ab"); // outputs true // …
私はそれを考えるために使用されるprivate valとprivate final val、私はScalaのリファレンスセクション4.1を見るまで、同じです。 定数値の定義は次の形式です。 final val x = e ここで、eは定数式です(§6.24)。最後の修飾子が存在する必要があり、型注釈を与えることはできません。定数値xへの参照自体は、定数式として扱われます。生成されたコードでは、定義の右側に置き換えられます。 そして私はテストを書きました: class PrivateVal { private val privateVal = 0 def testPrivateVal = privateVal private final val privateFinalVal = 1 def testPrivateFinalVal = privateFinalVal } javap -c 出力: Compiled from "PrivateVal.scala" public class PrivateVal { public int testPrivateVal(); Code: 0: …
私が取り組んでいるコードベースで次のコードに出くわしました: public final class ConfigurationService { private static final ConfigurationService INSTANCE = new ConfigurationService(); private List providers; private ConfigurationService() { providers = new ArrayList(); } public static void addProvider(ConfigurationProvider provider) { INSTANCE.providers.add(provider); } ... INSTANCEとして宣言されfinalます。なぜオブジェクトを追加できるのINSTANCEですか?それはfinalの使用を無効にするべきではありません。(そうではありません)。 答えはポインタとメモリで何かをしなければならないと思いますが、確かに知りたいです。