.NETでのプロパティとメソッドの使用法に関するこのMSDNの記事を読んでいました。プロパティまたはメソッドを使用する理由とタイミングを示します。
プロパティは、フィールドのように使用することを目的としています。つまり、プロパティが計算上複雑になったり、副作用が発生したりしないようにする必要があります。
それ以外の場合は、メソッドを使用する必要があります。
この違いをJavaでどのように表現できるかを自問していました。
あなたの意見は何ですか?
.NETでのプロパティとメソッドの使用法に関するこのMSDNの記事を読んでいました。プロパティまたはメソッドを使用する理由とタイミングを示します。
プロパティは、フィールドのように使用することを目的としています。つまり、プロパティが計算上複雑になったり、副作用が発生したりしないようにする必要があります。
それ以外の場合は、メソッドを使用する必要があります。
この違いをJavaでどのように表現できるかを自問していました。
あなたの意見は何ですか?
この違いをJavaでどのように表現できるかを自問していました。
メソッドにプレフィックスを使用しないでください。get
これは通常、メソッドが安価であることを意味します(ゲッターは通常、フィールドにアクセスするか、他のゲッターに委任するか、他のゲッターに基づいてかなり単純な計算を実行するため)。たとえば、クラスにこのインターフェイスがある場合:
class Blob {
long getLength() { ... }
ByteBuffer getBytes() { ... }
Sha1Checksum getChecksum() { ... }
}
...から長さ、内容、およびチェックサムを取得することBlob
も同様にコストがかかるように思われます。代わりに、このようにした場合:
interface Blob {
long getLength() { ... }
ByteBuffer getBytes() { ... }
Sha1Checksum calculateChecksum() { ... }
}
calculateChecksum()
...その名前が単に何かを得る以上のことをするだろうと言っているので、他の操作よりも高価になると予想できることが明らかになります。
ある程度、複雑さはインターフェースに見られるべきではない実装の問題です(多分、Blob
構築時にチェックサムを熱心に計算することにしますか?)が、区別することが理にかなっている場合があります。
私はその記事が言っていることに同意しません。プロパティはシンタックスシュガーです。それ以外の場合は、フィールドを使用するだけです。
ゲッター/プロパティのポイントはカプセル化です。ユーザーは、それが単なるフィールドなのか、毎回計算するものなのか、ランダムな値なのかを知りません。
これは、私にとって、「データ構造」ではないJavaのすべてのクラスには、そのフィールド(アクセス可能である必要がある)のゲッターとセッターがあることを意味します。
場合によります。すべての操作が完全に内部である場合getSomething()
は、複雑な実装でも問題ありません。ゲッター/セッター/プロパティの全体的なポイントは、実装の詳細をカプセル化して非表示にすることです。将来、それらが複雑なものに変更された場合でも同様です。
これの例外は、操作が非常に複雑で、かなりの時間またはリソースがかかる可能性がある場合です(たとえば、インターネットからデータをダウンロードする)。その場合、別のメソッド名を使用する可能性があります。これは、カプセル化を破るようなものですが、便利で実用的です。
ただし、ゲッターに観察可能な副作用getSomething()
がある場合は、混乱を避けるために、単純な規則を使用しない可能性があります。たぶん私はupdateAndReturn()
orgetAndComplexify()
またはorgetFromWeb()
またはそのようなものを使用します。
C#プロパティは、基本的にJavaのゲッターとセッターを1つにまとめたものです。1つのインスタンスにゲッターとセッターの両方を使用する必要がある場合は、常にプロパティを選択します。Javaでは、このオプションはありません。