【问题标题】:best practise to use string in java [closed]在java中使用字符串的最佳实践[关闭]
【发布时间】:2017-12-11 18:45:54
【问题描述】:

在java中使用字符串变量的最佳实践是什么? 在使用/操作它之前是否必须声明和初始化它。

例如:

String thisString; // is this best practice

String thatString =""; // or is this best practice

【问题讨论】:

  • 这取决于很多事情。假设您有一个只有一个构造函数的类,该构造函数需要字符串参数并将传递的参数分配给字符串字段。在这种情况下,为其分配默认值是没有意义的,因为它总是以构造函数传递的值结束。就目前而言,您的问题似乎太宽泛了。
  • “是否必须在使用前声明...” 是的。尝试使用您尚未声明的变量、String 或其他变量,看看会发生什么。

标签: java


【解决方案1】:

如果它是一个字段,你通常会在没有初始化的情况下声明它,并在构造函数中为其分配一个值。

如果它是一个局部变量,最好的做法是在你知道它的预期值的地方声明它,这样你就可以用一个有意义的值来初始化它:

String myString = "Result = " + xyz;

引入没有有意义值的变量(在大多数情况下)是不好的风格。 (为什么要为尚未决定的事物引入名称(= 变量)?)

在这样的情况下

String myString;
if (someCondition) {
    myString = "A";
} else {
    myString = "B";
}
System.out.println(myString);

如果很难使用相同的语句来声明和分配字符串,最好在不初始化的情况下声明变量。然后编译器会检查在所有执行路径中,您是否在使用变量之前为其分配了一个值,并且永远不会出现一些被遗忘的分配。

【讨论】:

    【解决方案2】:

    Afaik 这里没有严格的约定。如果我已经知道分配,我宁愿在声明时初始化一个字符串变量,例如:

    String name = generateName();
    

    如果是静态值,则应声明为最终静态变量:

    private final static DEFAULT_NAME = "John Doe";
    

    如果需要赋值前的变量:

    String name;
    if(useLongNames) {
        name = firstame;
    }
    else {
        name = title + " " + fistname + " " + lastname;
    }
    // some code which uses name
    

    此外,您可以考虑将所有变量声明设为 final,您只想分配一次。这将防止您出现某种错误,这些错误可能已经被 IDE 检测到。

    【讨论】:

      【解决方案3】:
      1. 这完全取决于您在哪里创建字符串变量。
      2. 如果您在类的实例变量中创建字符串变量,那么
        你不需要初始化它,因为java会提供默认值 该变量即空。所以你可以使用 String thisString;如果它是一个 实例变量。
      3. 如果您要在函数内创建字符串变量,它会是 总是更好地创建一个以 null 作为值的变量。因为 null 意味着我 尚未初始化此变量,它没有值且为空 字符串表示我知道该值并且它是空的。

      【讨论】:

      • 我不同意第 3 点。根本不初始化变量会使编译器检查您使用字符串的执行路径并且没有为其分配值。这是一个有用的检查,但只有在变量未初始化时才有效。
      • 只是补充@RalfKleberhoff 的观点:如果您打算将null 分配给变量,那么整个JLS Chapter 16 将是多余的。
      • 您好 Ralf 和 A​​ndy...感谢您对第 3 点的见解。它真的很有帮助。我认为我做出了正确的决定,即使用堆栈溢出来回答有助于清除我的概念的问题。如果我们将它初始化为空字符串,它会不会占用一定数量的内存?我知道它的数量不多,但它仍然占用一些内存对吗?另外,如果java本身声明字符串的默认值为null,我们在函数内部初始化它时不应该使用相同的值吗?
      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      • 2020-12-10
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多