如何在Java中初始化一个字符串?

6

我已经开始使用setter方法而不是将参数放入默认构造函数中,因为这有助于更好地组织我的代码。

问题在于,在我正在做的项目中,唯一的变量是一个字符串,我不确定是否应该在声明时初始化它(作为全局变量?),在setter实例方法中初始化它还是在类构造函数中初始化它。

我想知道这种设置是否存在任何问题,例如实例在使用其setter方法之前未初始化:

class MyClass{

  private String myString; 

  public MyClass(){

  }
  public void setStuff(String s){ 

    this.myString=s;
  }
}

2
我不太确定你所说的“全局变量”是什么意思,因为Java没有全局变量。 - Ivan
2
在Java中,你所谓的全局变量被称为“实例变量”。实例变量会被初始化为它们的默认值。(在这里,你的字符串变量将被初始化为null) - Rohit Jain
你应该阅读Sun/Oracle Java 教程,特别是有关原始数据类型的章节。 - Roddy of the Frozen Peas
1
Java字符串是不可变的,因此没有必要使用“new”关键字来创建一个字符串。应该使用字面值(双引号)代替。 - ecbrodie
1
如果你是某种纯粹主义者,你可以使用 myString = new String("Some string");,但它会导致不必要的新字符串对象的创建(与直接使用文字值相比)。 - Hot Licks
显示剩余2条评论
5个回答

7

为什么不直接初始化为:

private String myString = "My string";

以最简单的方式实现。

或者,如果它最初为null,则为myString = null;,或者如果您想将其初始化为null(空)字符串,则为myString = "";。(但是所有类和实例变量都会隐式初始化为null,因此myString = null;对于局部变量来说是多余的。) - Hot Licks
2
@HotLicks。它不会自动初始化为null吗?因为它是实例变量? - Rohit Jain
@RohitJain -- 是的,我正要加上那个点。但有时候将初始化声明为null是一种礼节性的做法。 - Hot Licks
@Magpie,你可以这样做,没有问题。还有一件事,你从来没有定义过“默认构造函数”,而是“无参构造函数”。 - Rohit Jain
1
@Magpie.. 默认构造函数实际上只是一个零参数构造函数,但它是由编译器定义的。但当我们定义自己的零参数构造函数时,我们不会将其称为默认构造函数。它只是零参数构造函数。我之所以写下这个,是因为我看到你将你的零参数构造函数称为默认构造函数。 - Rohit Jain
显示剩余3条评论

3

好的,这取决于变量是什么以及它将要做什么。

它是一个常量吗?如果是,您可以像这样初始化它:

private final String myString = "foo";

这是指要定义一个实例变量吗?如果是,你应该使用如下方法:

public MyClass(string myString)
{
    this.myString = myString;
}

如果它是一种可选属性,你目前的方式可能也可以。最终,一切都取决于你将如何使用该变量。

如果它是常量,那么它应该是一个常量:private static final。 - Frank Pavageau
我想使用setter,这就是为什么。 - Magpie
你说的“想要使用setter”,是什么意思?我们不知道你想做什么,所以无法告诉你最好的方法。使用mutators有时候是合适的,但你不应该“想要使用setter”,而是根据每种情况选择最合适的方式,有时候可能是使用setter,有时候则不是。 - Jordan Kaye
无论如何,字符串都是不可变的,它不会改变。 - Don Larynx

2

不确定你所说的全局变量是什么意思?它是否真正是一个无论创建哪个对象都相同的变量?如果是这样,那么它应该是静态的。

private static String myString = "str";

如果它从未更改,则应将其定义为全局常量,即final。
public static final String MY_STRING = "str";

接下来可以将其公开并通过访问

MyClass.MY_STRING

如果它只适用于创建的该类每个对象,则在构造函数或声明中初始化它。


谢谢,这并没有回答问题,但这是非常有价值的信息。你介意我补充一下你的答案来完善它吗? - Magpie
1
好的,开始吧 :) @Magpie - RNJ

1

就像你所说的,这对我来说看起来很不错。顺便说一句,“全局变量”可能会误导,因为它可能暗示该变量是公共的,而实际上它是私有的,但可以通过公共的getter/setter在外部访问。

但是,初始化字符串的最简单方法是:

private String foo = "some string";

你是认真的吗?它是String变量的名称。 - amphibient
2
@Magpie -- "foo"(以及“bar”)是示例程序中变量的传统名称。这个名字间接来源于军事俚语缩写FUBAR——意为彻底搞砸了。 - Hot Licks

0

这取决于 MyClass 将要做什么。大多数情况下,最好有一个构造函数来初始化私有变量,同时还要有一个 getter 和 setter。

原因之一是如果 MyClass 有一个方法 foo 需要初始化 myString,而您忘记调用 setStuff 会怎样呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接