3

プライベートな可視性を持つインスタンス変数がある場合、セッターを使用してその値を変更する必要がありますか、それとも単に値を直接変更する必要がありますか?

この例のインスタンス変数は、このクラスでのみ変更されるため、セッターはプライベートになります。セッターを使用することは、それがどのように/いつ変更されるかをローカライズするので正しい方法だと思いますが、それは何らかの理由で私を悩ませているだけです!

私の質問をより明確に伝えるのに役立つ可能性のあるコードについては、以下を参照してください

public class A {

private int i;

public A() {
   i = 5
}

private void doSomeCalculationsA() {
   //work done here which results in the value of i being directly changed
   i = 7
}

private void doSomeCalculationsB() {
   //work done here which results in change value of i being changed via the setter
   setI(5)
}

private void setI(int newValue) {
   i = newValue;
}

}
4

10 に答える 10

2

ほとんどの場合、単純な方が明確だと思う傾向があります。あなたのsetIがセッターになるだけなら、私はそれを持っていません。その方法がいつかもっと何かをすることができることをほのめかしたいのなら、あなたはそれを持っていることを検討するかもしれませんが、私にとってはYAGNIが最良のアプローチです。

「実際に必要なときに常に実装します。必要だと予測したときではありません。」

于 2012-05-07T20:53:50.953 に答える
1

関数で実際に何らかの操作/計算が行われない限り、プライベートセッター/ゲッターを使用しても意味がありません。

于 2012-05-07T20:53:34.137 に答える
1

ここでは、読みやすさと剛性という2つの考慮事項があります。この変数が本当にプライベートである場合、変数に直接アクセスすることはまったく問題ありません。参照がどのように機能し、何を参照しているのかは疑問の余地がないため、変数参照が読みやすくなります。これはインスタンス変数でなければならないことが一目でわかります。

以前は、値のフェッチ方法を変更する必要がある場合(プライベートでも)、大量の直接参照があると問題が発生しにくくなる可能性があるため、プライベート変数のアクセサーを作成することをお勧めしていました。これが剛性の問題です。現在、1つのメニュー項目で変数を抽象化できるリファクタリングツールがあるため、アクセサーを作成して呼び出す必要がある場合でも、それは難しくありません。そのため、メソッドにアクセスするよりも、直接参照の単純さと読みやすさを優先するように推奨事項を変更しました。

于 2012-05-07T20:57:05.113 に答える
0

setter/getterクラスのメンバー変数を呼び出すJava POJOことをお勧めします。あなたの場合は、setter

于 2012-05-07T20:53:15.777 に答える
0

変数が外部からアクセスされない場合(つまり、その値を要求する別のオブジェクト)、内部で変更することは許容されます。それ以外の場合は、アクセサー/ミューテーターを使用する必要があります。

于 2012-05-07T20:53:57.733 に答える
0

セッターが必要な理由は、変数を変更するときに追加の変更や計算を行う必要がある場合、または外部クラスからの変数へのアクセスを制限する必要がある場合です。この場合、何の違いもありませんが、メソッドを呼び出すために必要な余分な時間が追加されます。

于 2012-05-07T20:54:06.953 に答える
0

外部の別のオブジェクトがその値を変更できるかどうかに基づいて異なります。たとえば、ArrayListクラスには、ゲッターがパブリックである間、sizeプライベートセッターの属性addと操作があります。remove別のオブジェクトがその値をすぐに変更できる場合は、セッターをパブリックにする必要があります。

于 2012-05-07T20:55:33.383 に答える
0

ベストプラクティスはセッターを用意することですが、セッターがないと何か間違ったことをしているとは感じません。設定する前に何らかのアクション(検証など)が必要な場合にのみ、後で追加できるからです。

OOP用語では、オブジェクトのブラックボックスの背後にまだ「カプセル化」されているため、それが本当に重要かどうかはわかりません。また、セッターがなくても問題ありません。

一貫性を保つように努め、進捗状況の測定として機能するソフトウェアがあることを確認します。

于 2012-05-07T20:56:33.870 に答える
0

ここに明確な勝者はいないと思います。それはスタイルの問題です。多くの人は、クラス内であっても、検証などを可能にする単一の変更ポイントを提供し、フィールドの値を変更した人を追跡する方が簡単であると言って、セッターを使用することを好みます。最新のIDEでは、IntelliSenseはどちらの方法でも機能しますが、ほとんどの場合、IMHOは検証を必要としないため、その準備は投機的な一般性の軽度のケースである可能性があります。そのため、値を直接設定する方が簡単な場合もあります。

于 2012-05-07T20:56:44.333 に答える
0

私がメソッドを使用する主な理由は、1つの変数が同時に変更する必要がある2番目の変数に関連している場合です(スレッド化と並行性の問題について考えてください)。

于 2012-05-07T20:57:50.137 に答える