【问题标题】:Local vs Member variable proper code placement本地 vs 成员变量正确的代码放置
【发布时间】:2016-09-08 20:55:10
【问题描述】:

我还是个新手,但我想现在就开始正确编码,而不是以后。如果我错了,请纠正我,但方法应该是程序的自给自足和独立功能。那么这是否意味着给定方法需要操作的所有内容都应该在该方法中实例化?我不知道内存是如何运作的,但是如果多次使用以下方法,理论上是不是也创建了它的局部变量的多个实例?如果我运行这个方法 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;

}

【问题讨论】:

标签: java variables methods


【解决方案1】:

给定方法需要操作的所有东西都应该在该方法中实例化?

这取决于上下文。

如果有更多方法需要同一个对象,最好不要为多个方法多次实例化它。只需将它实例化一次到主类中(例如)。

所以要小心选择放置和实例化对象的位置。

【讨论】:

    【解决方案2】:

    每次调用 checkPhone() 时,都会创建一个新的 Scanner 和正则表达式字符串。一旦函数结束, Scanner 和 phoneRegex 对象将有资格进行垃圾回收,因为您不会在任何地方保留对它们的引用,因此在任何给定时间内存中可能只有一个它们的实例。 (实际上,正则表达式可能会被缓存,因为它是一个文字字符串,所以它只会被创建一次)。

    但是,最好将 Scanner 和 regex String 设为类的实例变量,在构造函数中创建而不是在 checkPhone() 中创建。这样您就不会产生为每次调用重新创建它们的费用。

    至于参数“phone”,取决于调用者是如何编码的,多个调用是否有多个字符串。

    【讨论】:

      猜你喜欢
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多