2012-03-13 12 views
2

私が理解するところでは、ゲッターとセッターは、すべての変数や状況に使用することをお勧めします。ここでゲッターとセッターを使用しない場合がありますか?

私は私が知りたい、私はこのような状況でそれらを残すことができますか、その悪い習慣である彼らは単にコードが長いと厄介作っているようで、ここでの状況を持っている...しかし

私が持っています次のクラス -

public class Conversation { 

    class Message 
    { 
     private int id; 
     private int senderId; 
     private Timestamp timeSent; 
     private String text; 
    } 

    private int conversationId; 
    private int userIdA; 
    private int userIdB; 
    private ArrayList<Message> messages = new ArrayList<Message>(); 
... 
... (Getters and setters for members of Conversation) 
... 
} 

私は会話のメンバー変数にゲッターとセッターを使用しています。しかし、私は内部クラス、メッセージ、変数のためにそれらを使用したくありません。フィラーのコードに約30行追加するだけで、はるかに扱いにくくなります。それで、ここにそれらを残すことは悪い習慣ですか? Message変数を編集することは決してないでしょう。それらはコンストラクタMessage(...、...、...、...)への呼び出しで設定され、その後はただ読み込まれます。だから私は間違いなくゲッタを残してもいいと思いますが、セッターはどうですか?

+4

編集しない場合は、最終的に宣言できます。 –

+0

http://stackoverflow.com/questions/565095/java-are-getters-and-setters-evil – assylias

+1

また、会話クラスでのみMessageクラスを使用する場合は、Message privateを宣言してanyを省略することができますMessageクラス内のアクセス修飾子。 –

答えて

3

Messageがプライベートだった場合は、フィールドを直接使用することで全く問題はありません。それは単なる内部詳細構造体であり、カプセル化の問題はありません(外部クラスは内部クラスのプライベート変数をすべて見ることができるため)。

しかし、はpackage-privateです。そのパッケージ内の誰もがそのフィールドを見ることができます。公開されたAPIではないので、これは灰色の領域ですが、パッケージの大きさに応じて、カプセル化を行おうとすると合理的です。たとえば、大きなパッケージで、他のクラスがMessageに応じて起動する場合(もしそうでない場合はprivateにすることもできます)、Messageの内部構造を変更したい場合は、カプセル化の問題が発生する可能性があります。それで、それは判断の呼び出しです。

Messageが公開されていれば、ゲッターの提供は間違いありません。

BtwここでMessagePODと同じように使用している場合は、staticにする必要があります。一般的に言えば、staticがそれより優れています。

2

すべての変数と状況で使用することをお勧めします。

まあ、neveralwaysのルールは悪いです。これを除きます。 :)

getterとsetterは、標準的な方法で使用するだけで使用しないでください。たとえば、私がクラスPoint2dと2人のメンバーxyを持っていたなら、おそらくアクセサを使用しないでしょう。

自分自身に質問してください - 私のメンバーはコード内で多く変更されますか?私はメンバーを変更するのが面倒なデバッグと見ていますか?答えが「はい」の場合は、アクセサーが必要です。そうでない場合は、コードを読みやすく、保守しやすいものにしてください。

+1

プログラミングコースの最初の行を盗もうとしています。 :) – madth3

1

彼らは

new Message(int,int,Timestamp, String) 

に設定され、フィールドは変更されません場合、それが最善であるだけメソッドを取得しています。

getメソッドしかないと、読み取り専用にするという制約があります。

関連する問題