Java の非プリミティブ (オブジェクト) データ型は、プリミティブ データ型と同じように扱われますか? 治療というか…
1 : クラス内で非公開にする必要がありますか?
2 : 宣言中に何らかの値に初期化する必要がありますか? (例:String S = ""
の代わりにString S
)
3 : getter と setter も必要ですか?
3つの質問すべてに対する簡単な答えは「はい」です。問題の変数がプリミティブ型であるかどうかに関係なく、3つのプラクティスは適切です。
注意すべき1つの落とし穴は、可変オブジェクトへの参照があり、ゲッターがその参照を返す場合、これにより、呼び出し元がオブジェクトを変更できる可能性があることです(これはクラスにプライベートだと思っていました!)
2つの場合の別の違いは、オブジェクト参照をに設定できることnull
です。これは便利な場合がありますが、エラーの原因になる場合もあります。ここで指摘する価値があるかもしれませんが、同じではString s = null
ありString s = ""
ません。
最後に、オブジェクトの場合、との違いを理解することが重要obj1 == obj2
ですobj1.equals(obj2)
。プリミティブ型を比較する方法は1つしかないため、この区別はプリミティブ型では発生しません。
to 1:もちろん、それが情報隠蔽の原則です
to 2:それらの多くはすでに「内部」で初期化されていますが、自分で行う方がよいでしょう
〜3:もちろん、情報隠蔽も
ベスト、フロー
特定の属性をクラス内でプライベートにする必要があるというルールは知りません.Javaは、保護されたものやパブリックなどの他の修飾子を提供し、パッケージのアクセシビリティを意味する修飾子はありません. これらはすべて、設計に応じて適切と見なされるさまざまなレベルのカプセル化を適用できるようにするためのものです。
質問のフィールド初期化部分では、フィールドがクラスで宣言されている場合、フィールドが参照型の場合、デフォルトで nullに初期化されるため、必要と思わない限り初期化する必要はないと思いますまたは、フィールドがデフォルト値に初期化することを意味する final として宣言されていない限り。
質問のゲッターとセッターの部分については、これらはカプセル化を強制する方法にすぎないと思います。Allan Snyder は、論文「オブジェクト指向プログラミング言語におけるカプセル化と継承」で次のように書いています。
カプセル化の利点を最大化するには、外部インターフェイスでの実装の詳細の公開を最小限に抑える必要があります [...] たとえば、オブジェクト指向言語の 1 つの特徴は、インスタンス変数の名前を変更できるようにデザイナーがクラスを定義できるかどうかです。クライアントに影響を与えることなく。
また、Leonid Mikhajlov と Emil Sekerinski によるA Study of the Fragile Base Class Problem と呼ばれる素晴らしい記事は、継承に関連するいくつかの古典的な問題を回避するために、これらすべてのレベルのカプセル化と間接化が適切である理由について、いくつかの良いアイデアを示している可能性があります。
「基本クラスの状態に直接アクセスしない」という要件: 拡張クラスは、その基本クラスの状態に直接アクセスしてはならず、基本クラスのメソッドを呼び出すことによってのみアクセスする必要があります。
彼らの論文は、getter メソッドや setter メソッドのようなものがクラス拡張の脆弱性を回避するための優れたアイデアである理由について、非常に説得力のある理由を示しています。
すべての質問に対する答えは「はい」です。ここでは、データのカプセル化と、型に依存しないBeanの命名規則の一般的な原則について説明します。
1 : クラス内でプライベートにする必要があります。
はい。プリミティブ型の変数を非公開として宣言する必要があるのは、まさにそのためです。
2 : 宣言中に何らかの値を初期化する必要があります (例: String S の代わりに String S = "")
場合によります。初期化されていない状態 ( null
) にアプリケーション固有の意味がある場合は、デフォルトで初期化しないでください。それ以外の場合は、可能であれば、null 以外のデフォルト値に初期化することをお勧めします。
3 : ゲッターとセッターも必要です。
はい。プリミティブ型のケースでゲッターを宣言する必要があるのは、まさにそのためです。セッターも宣言する必要がありますが、変数を設定可能にしたい場合に限ります。
明らかに、オブジェクト型変数はプライベートで初期化され、必要に応じてゲッターとセッターを持つ必要があります。これにより、OOP はコードを安全に保ちながらアクセスできるようになります。
1 : クラス内でプライベートにする必要があります。 YES 2 : 宣言中に何らかの値を初期化する必要があります (例: String S の代わりに String S = "") YES 3 : ゲッターとセッターも持つ必要があります。 はい
1. と 3. に関しては、一般的な原則はデータのカプセル化であり、データのタイプ (プリミティブまたは非プリミティブ) とは実際には関係ありません。
初期化について: クラス参照変数はデフォルトで に初期化されますnull
。それ以外は、クラスの設計に適した値に単純に初期化する必要があります。