1

こんにちは、私はプログラム「フランチャイズ」に取り組んでいます。フランチャイズには、所有者 (フランチャイズの名前の所有者)、州 (フランチャイズがある州の 2 文字の文字列)、および売上 (1 日のフランチャイズでの総売上) があり、これらはすべてコンストラクタであり、変更できません。

package prob2;

public class Franchise {
    final String name;
    final String state;
    final double sales;

protected Franchise(String name, String state, double sales ) {
    this.name = name;
    this.state = state;
    this.sales = sales;
  }

私の質問は次のとおりです。名前、状態、および販売はコンストラクターで設定する必要があり、変更できません。「保護」を使用してこの権利を行っているのですか、それとも変数を「最終」に設定する方がよいですか?

助けてくれてありがとう。

4

2 に答える 2

1

「保護」を使用してこれを正しく行っていますか、それとも変数を「最終」に設定する方が良いですか?

キーワードは、protectedあなたが思っていることを意味するものではありません。(この場合)が実際に意味することは次のとおりです。

「このコンストラクターは、同じパッケージ内の任意のクラス、およびこのクラスの任意のサブクラスから呼び出すことができます」。

フィールドを直接「保護」するわけではありません。

final正しい解決策は、変更したくないフィールドに修飾子を追加することです。Java コンパイラーは、それぞれのフィールドを変更する (通常の) Java コードの作成を停止します。


finalまた、フィールドでさえ変更の影響を受けないわけではないことに注意する必要があります。リフレクションを使用して、実行時に修飾子をオーバーライドし、private finalフィールドを変更することもできます。privateおよびを使用してハード セキュリティを実装する場合はfinal、これを考慮する必要があります。基本的に、これはサンドボックス化された信頼できないコードに対する保護としてのみ機能します...さらに、フィールドが参照するオブジェクトではなく、フィールドの値のみを保護します。

于 2013-09-10T03:12:12.890 に答える
1

現時点ではそれらを変更するものは何もありませんが、それらを変更するメソッドを追加することを妨げるものは何もありません。あなたの現在の道は、変わるべきではないことを覚えておく必要があることを意味します。

それらを決して変更したくない場合は、それらをfinalに設定します。これは、コンパイラーがそれらを変更しようとするかどうかをチェックし、コンストラクターでそれらに値を与えることを確認することを意味します。また、他の開発者 (数週間後にあなたを含む) に、変更するつもりはないことを明確にします。

于 2013-09-10T03:05:25.517 に答える