ゲッター/セッターとコンストラクターの使用について少し混乱しています(例については以下のコードを参照してください)
public class ExampleClass {
private int value = 0;
public ExampleClass () {
value = 0;
}
public ExampleClass (int i) {
this.value = i;
}
public int getValue() {
return value;
}
public void setValue(int val) {
this.value = val;
}
public static void main(String[] args) {
ExampleClass example = new ExampleClass (20);
example.setValue(20);
//Both lines above do same thing - why use constructor?
System.out.println(example.getvalue());
}
}
私が学んだのは、セキュリティのためにゲッター/セッターが必要であり、後で値を変更または編集するにも使用できることです。
私の質問は、コンストラクターが初期化のポイントであり、デフォルトのコンストラクターが常に存在する場合、ゲッター/セッターの代わりに値を初期化するためにパラメーター付きのコンストラクターを使用する理由です。ゲッターとセッターを使用してもセキュリティは提供されません。また、どの段階でも値を簡単に変更できます。この点を明確にしてください。
デフォルトコンストラクタは常にそこにあります
まあ実際には必ずしもそうではありません。デフォルトのコンストラクターは、コンパイラーによって提供されるものです(もちろん、引数なしのコンストラクターです)クラスに他のコンストラクターが定義されていない場合のみ
set getの代わりにパラメーターを使用してコンストラクターを使用して値を初期化する理由
初期化時にすべての値が提供され、デフォルト値がない場合にのみ、オブジェクトを常に作成できるという条件が存在する可能性があるためです。したがって、すべての値を指定する必要があります。そうしないと、コードがコンパイルされません。
このBook
クラスを検討してください
_public class Book {
private String title;
private String author;
public Book(String title, String author){
this.title = title;
this.author = author;
}
//getters and setters here
}
_
ブックがtitle
とauthor
を持っている場合にのみ、ブックを作成できる条件を考えます。
new Book()
は実行できません。1つのコンストラクターが既に定義されているため、コンパイラーはコンストラクターを提供しません。new Book()
を実行できません。これは、パラメーター化されたコンストラクターが有用な条件です。
クラスの新しいオブジェクトを作成するときに、いくつかの値を指定する必要がある場合があります。たとえば、データベースに接続してConnectionクラスオブジェクトを作成する場合、接続文字列を指定する必要があります。これにより、接続先を認識できるようになります。ターゲットデータベースを指定せずに新しい接続を作成することは、まったく役に立たないでしょう?
また、これを見てください
Foo foo=new Foo(1,2,3,4,5,6,7);
この
Foo foo=new Foo();
foo.setP1(1);
foo.setP2(2);
foo.setP3(3);
foo.setP4(4);
foo.setP5(5);
foo.setP6(6);
foo.setP7(7);
最初のものは良く見えますよね?
私の質問は、コンストラクタが初期化のポイントであり、デフォルトのコンストラクタが常に存在する場合、set getの代わりにパラメータを使用してコンストラクタを使用して値を初期化する理由です。
オブジェクトが異なる状態に移行することを考える場合、パラメーター化されたコンストラクターとセッターおよびゲッターを使用することは理にかなっています。実生活のシナリオを試してみましょう:従業員クラスについて考えてみましょう。新しい従業員が参加します。多くの詳細は知らないがほとんど知らず、従業員のオブジェクトを作成します。システムに従業員を登録する必要があるため、パラメーター化されたコンストラクターを使用しました。従業員の詳細を取得したら、ゲッターとセッターを使用して属性を更新します。
これは純粋にあなたのコーディングスタイル次第です。しかし、IMO、パラメータ化されたコンストラクタを使用します:
変更してはならない値を初期化します。 (人物オブジェクトのユーザー名パラメーターなど)
どの値を設定せずにこれらの値を初期化するには、オブジェクトは無効な状態になります。
たとえば、ログインパラメータをメソッドに送信しているとします。これらの方法で使用できます
Login obj = new Login();
obj.setUsername("user");
obj.setPassword("pw")// what if someone commented this out, or you forget to call it
and otherway,
Login obj = new Login("user", "pw");
最初のケースでユーザー名を設定した直後にLoginオブジェクトを送信できますが、受信側では無効になります。ただし、2番目の方法はバグが少ないため、必要なパラメーターをすべて渡す必要があります。
作成時にすべてのフィールドを特定の値に設定する必要がない場合があります。たとえば、アレイを作成するとき。また、すでに述べたように、ゲッターを使用すると安全です。nullpointerを取得することはできません。
パラメーターを使用してコンストラクターを定義した場合は、必ずデフォルトのコンストラクターを作成してください。または、使用しないでください。
簡単にするためです。オブジェクトを作成してセッターを使用するよりも、コンストラクターを使用する方がコードが少なくて済みます。
まず、コンストラクターとセッターの両方のメソッドは、オブジェクトの属性を変更する安全な方法です。クラスの作成者から、インスタンスを変更する安全な方法を公開するか、安全でない方法が予想されます。
デフォルトのコンストラクタは、作成していない場合は常に提供されます。
// Example of a Class with a Default Constructor
public class GetSet {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public static void main(String[] args) {
// Theres a implicit Default Constructor here
// Its ok to do that
// GetSet obj = new GetSet();
GetSet obj = new GetSet();
}
}
// Example of a Class without a Default Constructor
public class GetSet2 {
public GetSet2(String value) {
this.value = value;
}
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public static void main(String[] args) {
// GetSet2 obj = new GetSet2(); // compile time error
// Default constructor is not provided, since u wrote one
}
}
2。どちらが優れているか:コンストラクターまたはセッターを使用して、それはあなたが望むものに依存します。既存のオブジェクトの属性のみを変更する場合、uはセッターを使用するか、完全に満たされたオブジェクトの場合は代わりにコンストラクターを使用することができます。
// Example of modifing an obj via Setter and Constructor
public class GetSet3 {
public GetSet3(String value1, String value2, String value3, String value4) {
this.value1 = value1;
this.value2 = value2;
this.value3 = value3;
this.value4 = value4;
}
private String value1;
private String value2;
private String value3;
private String value4;
// ... Getters and Setters
public static void main(String[] args) {
// Its easier to this
GetSet3 obj;
obj= new GetSet3("j", "a", "v", "a");
// instead that
// its also easy to forget or do something wrong
// when u have a lot of attributes to set
obj.setValue1("j");
obj.setValue2("a");
obj.setValue3("v");
obj.setValue4("a");
}
}
引数付きのコンストラクターを使用すると、オブジェクトを完全に構築できます。デフォルトのものを使用する場合は、セッターを使用してフィールドが設定されていることを確認する必要があります。いくつかのプロパティの設定中に、例外がスローされたと仮定します。使用できないオブジェクトがあります。いくつかの場合、セッターは公開されず、ゲッターが公開されます。これらの場合、引数付きのコンストラクターまたは名前付きコンストラクターが適切なオプションです。簡単に言えば、ゲッターとセッターはオブジェクトを初期化するというよりも独自の重要性を持っています。
コンストラクターでパラメーターとして値を設定すると、より少なく、よりエレガントで、より読みやすいコードを使用して作成するためです。さらに、一部のフィールドがオブジェクトに不可欠な場合があるため、パラメーターコンストラクターは、ユーザーがオブジェクトの機能に必要なフィールドを省略してオブジェクトを作成できないようにします。ただし、セッターを呼び出すのは「妨げ」ではありません。
Nullポインターを避けるために、コンストラクターを介してオブジェクト変数を初期化する方が簡単で安全です。
最初に変数を初期化せずにオブジェクトをインスタンス化し、null変数の1つに対してget操作を実行すると、値を手動で設定するのを忘れたため、実行時にnullpointer例外が発生する場合があります。
その反対に、デフォルトのコンストラクタでオブジェクト変数を常に初期化すると、実行時にnullpointer例外が発生するリスクが大幅に低下します推奨)。