2016-09-08 12 views
-2

まだ初心者ですが、今は適切にコーディングを開始したいと思います。私が間違っていれば私を訂正してください。しかし、メソッドはプログラムの自己充分で独立した機能でなければなりません。つまり、これは、のメソッドが、そのメソッド内でインスタンス化される必要があるすべてのメソッドがであることを意味しますか?私はメモリがどのように動作するかを知りませんが、以下のメソッドが複数回使用される場合、理論的には複数のインスタンスをローカル変数として作成していませんか?私はこのメソッドを100回実行した場合、私は100文字列変数をメモリに持たないでしょう(文字列は最終的なので)、私のスキャナ変数を100回インスタンス化しましたか?私が正しく理解すれば、メンバ変数はオブジェクトの属性に対して特別に宣言されます。オブジェクトには正規表現変数が含まれていないので、それを参照してください。そのため、メンバー変数宣言から除外しています。ローカル変数とメンバ変数の適切なコード配置

このメソッドは、クラスに実装することができ、手間がかかりません。私の理解から、方法を作る正しい方法です。

これが標準であれば、この方法でもメソッドを作成し続けます。あなたがメンバーとローカル変数の配置を批評したり解説したりすることはできますか?

/** 
* Verifies proper phone number format. 
* @param phone 
*/ 
public void checkPhone(String phone) 
{ 

    //local scanner variable*** 
    Scanner in= new Scanner(System.in); 
    //regex*** 
    String phoneRegex = "\\d{3}-\\d{3}-\\d{4}"; 

    while(!phone.matches(phoneRegex)) 
    { 
     System.out.println("You have entered an invalid phone format."); 
     System.out.println("Proper format example: 123-999-1234"); 
     System.out.print("Re-enter phone number: "); 
     phone = in.nextLine(); 

    } 

    this.mPhoneNumber = phone; 

} 
+0

ようこそスタックオーバーフロー! [ツアー]を見て周りを見て、[ヘルプ]、特に[*どのように良い質問をしますか?*](/助け/やり方)と[* *](/ help/dont-ask)この質問はあまりにも広範で、おそらくあまりにも意見を基にして、SOの形式については質問しません。 *(私のダウンボートではなく、私は投票に投票しました)* –

答えて

0

checkPhone()を呼び出すたびに、新しいScannerとregex Stringを作成します。関数が終了すると、ScannerオブジェクトとphoneRegexオブジェクトはガベージコレクションの対象となります。ガベージコレクションは、どこにも参照を保持しないためです。そのため、いつでもメモリ内にインスタンスが1つしか存在しない可能性があります。 (実際には、正規表現はリテラル文字列であるためキャッシュされている可能性があります。

しかし、Scannerとregex Stringが、checkPhone()ではなくコンストラクタで作成されたクラスのインスタンス変数になっている方が良いでしょう。そうすれば、各呼び出しごとに再作成する必要はありません。

引数 "phone"は、呼び出し元が複数の呼び出しに対して複数の文字列があるかどうかをコーディングする方法によって異なります。

1

与えられたメソッドは、そのメソッド内でインスタンス化する必要がありますか?

状況によって異なります。

同じオブジェクトを必要とするメソッドが他にもある場合は、複数のメソッドに対して複数回インスタンス化しない方がよいでしょう。メインクラスに一度インスタンスするだけです(たとえば)。

したがって、オブジェクトを配置してインスタンス化する場所を選択してください。

関連する問題