2013-03-28 12 views
8

私のインターンシップで私の同僚の一人が私にヒントを与えました。私はこれが良い練習であるかどうかを知りたい。プライベート文字列またはpublic static String?

私がやっていたことは、含まれている値のためだけに使用され、実際に何かを行う関数を持たないクラスを作成することでした。(ゲッター、セッター、コンストラクタを除いて)それは常に同じ状態を保つ必要があるため

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; 
    } 
} 

:私の同僚は、私はまた、このようにそれを行うことができますことを言いました。

どちらが良いでしょうか?それとも、まだプライベートにすることも最終的にすることが望ましいかもしれませんか?私はすべてのオプションが明らかに機能することを意味します。私はちょうど良いと理由を知りたい。

+2

プライベートにするそれを最終的にする。 –

+1

セイムの言葉。パブリックメンバー変数は「有害なもの」とみなされます。あなたのオブジェクトが変更されていないときは(「不変」と言う)、メンバ変数finalを宣言します。これにより、たとえ誰かがあなたのクラスインスタンスを反映していても、コンストラクタでそれを設定し、変更を防止します。 –

+0

それは私がより良い選択肢と思っていたものでした。あなたの推論は何ですか? – WereWolfBoy

答えて

7

変数をプライベートにすると、クラス内の変数encapsulatingになります。これには多くのメリットがありますが、information hidingは上記のリンクに進むと学びます。

作成後も変更したくない場合は、最後にしてください。

+0

私はすでにカプセル化について学んできました。私は私のインターンシップで公開するように教えようとしたのは変だと思った。彼らは自分でそれをするので、私はまだ彼らの製品のためにそれを行います。しかし私は自分のプロジェクトでは決してしません。 – WereWolfBoy

+0

@WereWolfBoy:はい、プロダクション品質のコードでは、プライベートデータメンバーを常に使用するようにしてください。そして、あなたがインターンをやっている間に教えてくれたことは奇妙でした(私はインターンをしている間に生産品質のコードを書く方法を学ぶはずです)。しかし、テスト/プレイ/ペットプロジェクトで公開することはOKですが、生産品質コードでは決してOKです。あなたはこれについて質問する必要がありますか...... –

+2

私はこの人は開発者ではなくハッカーであり、おそらく彼の決定のすべての結果を理解していないと言います。そして、彼のアドバイスを見て、私は彼/彼女が将来私に言ったことに疲れているだろう。しかし、あなたがあなたが話していることを知らないのと同様に、インターンとして彼らはあなたを扱うので、その点を主張しようとしないでください。 – CodeChimp

1

これはどちらが良いでしょうか?それとも、それでもまだ をプライベートにしても最終的にするのが望ましいでしょうか?

開発者を成功させるには、正しく、効率的に、最も重要なプログラムを安全にプログラムする必要があります。セキュリティとパフォーマンスが最優先です。

公開すると、カプセル化は非常に重要であり、多くの利点があります。 Objectのプロパティを取得するたびに、ゲッターがあなたの友人になります。

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

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

1

変数にセッターメソッドを与えないというアイデアは、読み込み専用のフィールドになります。すなわち、読み込みのみできますが書き込むことはできないということです。つまり、finalキーワードを使用して定数にしますすべて。

私は定数が良いと思います。 finalキーワードはパフォーマンスを向上させます。続きを読むhere

1

ゲッターを持ってフィールドをプライベートにする必要があります。それがカプセル化と呼ばれています。

また、最終的にセッターを持たないことで、あなたのオブジェクトは不変です。パラレルプログラミングにとっては非常に良いことです。

1

カプセル化の原則を適切に使用するには、すべてのクラスフィールドを非公開にして、セッターとゲッターでアクセスします。それ以外の場合は、getName()を呼び出すときに追加ロジックを追加することもできます。第2の変種が使用されることもあるが、最初の方が良い。お役に立てれば。

4

Stringは不変なので、これで動作します。しかし、あなたが可変クラスへの参照を公開し、そのクラスがスレッドセーフではない場合はどうなりますか?あなたがしたい場合でも、defensive copyを返すことはできません。

これもカプセル化を中断しません。プライベート変数とgetterを使用します。

1

私は推測すると、それを持っているのはpublicというコードを単純にしているからです。このような状況では、Javaはあまりにも冗長であると批判されています。 Javascriptなどの言語では、これは(通常)常にpublicになります。

しかし、そのシンプルさは、安全で安定した拡張可能なコードとのトレードオフです。

なぜそれが重要であるかを見るには、すべてを公開している大規模なJavascriptプロジェクトを見てください。各クラスのコードはシンプルかもしれませんが、それらの関係や結果として生じるアーキテクチャは、最終的には維持する悪夢になります。

+0

彼らが作るものの多くはウェブサイトに関連していることは事実です...たくさんのJavaScriptコードを含んでいます。したがって、おそらくそれはjava/androidでも使用するからです。 – WereWolfBoy

0

だと思います。たとえば、getterを使用する場合は、それを上書きできます。時にはそれは非常に便利です。

関連する問題