web-dev-qa-db-ja.com

プライベート文字列またはパブリック静的文字列?

私のインターンシップで、同僚の1人がヒントをくれました。これが良い習慣かどうか知りたい。

私が行っていたのは、それらに含まれる値に対してのみ使用され、実際に何かを実行する関数を持たないクラスを作成することでした(ゲッター、セッター、コンストラクターを除いて)。私は次のように変数を宣言しました:

public class ObjectIUse{
  Private String name;

  public ObjectIUse(String name){
    this.name = name;
  }

  public String getName(){
    return name;
  }
}

常に同じ状態を保つ必要があるため、セッターは使用していません。私の同僚は、私もこの方法でそれを行うことができると言いました:

public class ObjectIUse{
  public final String name;

  public ObjectIUse(String name){
    this.name = name;
  }
}

なぜなら、公開されているので、ゲッターやセッターは必要ないからです。しかし、最終的なものなので、変更することはできません。

どちらが良いでしょうか?それとも、プライベートにするだけでなくファイナルにすることもできますか?もちろん、すべてのオプションが機能します。私はどちらがより良いのか、そしてなぜなのか知りたいだけです。

9
WereWolfBoy

変数をプライベートにします。そうすると、クラスの変数が encapsulating になります。これには多くの利点があります 情報の非表示 はその1つです。上記のリンクにアクセスすると、これがわかります。

作成後に変更しない場合は、最終的にも変更します。

7
MD Sayem Ahmed

Stringは不変であるため、これは機能します。しかし、変更可能なクラスへの参照を公開し、そのクラスがスレッドセーフでない場合はどうなりますか?必要な場合は 防御的コピー を返すこともできません。

言うまでもなく、これもカプセル化を壊します。プライベート変数とゲッターを使用します。

4
Deepak Bala

彼らの推論は、それをpublicにするとコードがよりシンプルになると思います。 Javaは、このような状況では冗長すぎると非難されます。Javascriptなどの言語では、これは(通常)常にpublicになります。

ただし、その単純さは、安全で安定した拡張可能なコードを使用することとのトレードオフです。

なぜそれが重要なのかを理解するには、すべてをパブリックとして記述された大規模なJavascriptプロジェクトを見てください。各クラスのコードは単純かもしれませんが、それらの関係、および結果として得られるアーキテクチャーは、維持するのが悪夢になります。

1
David Lavender

どちらが良いでしょうか?それとも、プライベートにするだけでなくファイナルにすることもできますか?

開発者として成功したい場合は、正しく、効率よく、最も重要なプログラムを安全に行う必要があります。セキュリティとパフォーマンスはそもそも第一です。

あなたがそれを公開すると、あなたは破ることになりますencapsulationこれは非常に重要であり、多くの利点があります。 Objectのプロパティを取得するたびに、ゲッターが友達になります。

一般に、Objectのプロパティに直接アクセスするべきではありません(extremの場合のみですが、これらもより良い方法で解決できます)。ゲッターとセッターはこれらの目的のために指定されています-カプセル化を維持し、オブジェクトを安全に処理します。

final variablesは通常、時間中に変更できないデータに使用されます。

1
Simon Dorociak

変数にセッターメソッドを提供しないという考えは、それを読み取り専用フィールドにします。つまり、読み取りのみが可能で書き込みは不可能であるため、finalキーワードを使用して定数にすることで、それをすべて。

定数の方がいいと思います。 finalキーワードはパフォーマンスを向上させます。続きを読む こちら

1
tmwanik

あなたは間違いなくゲッターを持ち、フィールドをプライベートにする必要があります。これをカプセル化と呼びます。

また、最終的なものにし、セッターを持たないことで、オブジェクトは不変であり、並列プログラミングには非常に適しています。

1
tibo

カプセル化の原則の適切な使用は、すべてのクラスフィールドをプライベートにし、セッターおよびゲッターを介してそれらにアクセスすることです。それ以外に、getName()を呼び出すときにロジックを追加したい場合があります。 2番目のバリアントが使用されることもありますが、最初のバリアントの方が適しています。お役に立てれば。

1
Egor

それは状況次第だと思います。たとえば、getterを使用する場合は、それをオーバーライドできます。時にはそれは非常に便利です。

0
shapkin