情報隠蔽の原理を理解しようとしています。getSpeed、setSpeed、getEngine、setEngine、getVIN、setVIN などのメソッドを持つ車両クラスがあるとします。車両には VIN が 1 つしかないため、情報の非表示を強制するために、クライアント クラスに setVIN の機能を与えたくありません。 (私は間違っているかもしれません)。このクラスに情報の非表示を適用する方法について、私はちょっと混乱しています。setVIN を非公開にしたくありません。しかし、一度 VIN を設定し、その後再度設定できないようにするにはどうすればよいでしょうか。それとも、そのようにする必要がありますか?
1093 次
2 に答える
2
情報を隠すということは、外部から直接変更するために内部 VIN フィールドを公開していないことを意味します。フィールドの変更を制御できるため、セッターを使用しても非表示の原則に違反しません。
あなたの場合、VINが一度だけ設定されるようにしたい場合は、コンストラクターで設定し、setVINを削除するのが最善の方法です。
ところで、これは一般的な質問ですが (問題ありません)、特定の言語を念頭に置いている場合は、言及する価値があるかもしれません。たとえば、一部の言語ではデフォルト以外のコンストラクタを使用できません。そのような言語では、setVIN を残しますが、呼び出されたときに VIN が既に設定されているかどうかをチェックしてもらいます。あった場合は、呼び出しを無視するか、例外をスローします。
于 2011-10-05T09:41:17.050 に答える
0
概念的に言えば、クラス/オブジェクトにプロパティがあるからといって、それがパブリックであるべきだという意味ではありません。「プロパティ」は、「ゲッター」および「セッター」関数を使用して割り当ておよび変更できますが、必要なもののみをパブリックとして公開できます。
「コードを見せて」と言うかもしれません:
public class JavaClass {
// hidden field "name"
protected String name;
// start property "Name"
// note: uses "name" field to store the property
public void setName(String value) {
//set passed parameter as name
name = value;
}
public String getName() {
return name;
}
// finish property "Name"
// start property "Id"
// note: uses "name" field to store the property
public void setId(String value) {
//set passed parameter as name
name = value;
}
public String getId() {
return name;
}
// finish property "Id"
// hidden field "years"
protected int years
// functions works as "read-only" properties
public int Years() {
return years;
}
// start constructor
public JavaClass() {
name = "unknown";
years = 1;
}
// finish constructor
public static void main(String args[]) {
JavaClass javaObject = new JavaClass();
//set name member of this object
javaObject.setName("Visitor");
// print the name
System.out.println("Hello: " + javaClassExample.getName());
//set name member of this object
javaObject.setId("Employee");
// print the name, not the Id, but are the same
System.out.println("Hello: " + javaClassExample.getName());
// and current years of age
System.out.println("Years: " + javaClassExample.Years());
} // public static void
} // class JavaClass
テストされていませんが、私の主張を説明していると思います。
于 2011-10-05T15:36:54.730 に答える