为字符串数组中的字符串变量赋值

Assign a value to a String variable in a String array

我正在尝试在数组中为字符串变量赋值:

String details = "passFirst0,passLast0,Molly,Quinn";
Passenger passenger = new Passenger(details);

public class Passenger {

    private String firstNameField;
    private String lastNameField;
    private String firstName;
    private String lastName;

    public Passenger(String details) {
        String[] temp = details.split(",");
        String[] fields = {firstNameField, lastNameField, firstName, lastName};

        for (int ctr = 0; ctr < fields.length; ctr++) {
            fields[ctr] = temp[ctr];
        }

        // Print instance variables - all null
        System.out.println(this.firstNameField);
        System.out.println(this.lastNameField);
        System.out.println(this.firstName);
        System.out.println(this.lastName);

        // Print array - has values
        System.out.println(Arrays.toString(fields));
    }

    // Methods
}

但是,实例变量本身保持为空,而 fields[] 在您遍历数组时具有值。

为什么会这样,如何实现?

在 "fields" 中,您拥有在 for 循环中设置的 "details" 的拆分值,而在实例变量中您什么也没有(它们未使用数据初始化)

因为没有设置所以为null,可以这样设置;

public class Passenger {

private String firstNameField = "a";
private String lastNameField = "b";
private String firstName = "c";
private String lastName "d";

或者像这样 constructor 的参数;

public Passenger(String details, String f, String l, String fn, String ln) {

   firstNameField = a;
   lastNameField = l;
   firstName = fn;
   lastName = ln;

   .....
}

如评论中所述,您确实在 for 循环中覆盖了数组值,但您尝试打印出 class 个成员;

System.out.println(this.firstNameField);
System.out.println(this.lastNameField);
System.out.println(this.firstName);
System.out.println(this.lastName);

未初始化。

为什么不像下面这样设置数组;

String[] temp = details.split(",");
    String[] fields = {temp[0], temp[1], temp[2], temp[3]};

为什么要费心其他变量,只需为每个需要的变量创建 getters,例如;

public String getFirstName() {
   return fields[2];
}

我不建议这样做,但您可以使用 Java 8 个方法参考:

public class Passenger {

    private String firstNameField;
    private String lastNameField;
    private String firstName;
    private String lastName;

    public Passenger(String details) {
        List<Consumer<String>> setters = Arrays.asList(this::setFirstNameField,
                                                       this::setLastNameField,
                                                       this::setFirstName,
                                                       this::setLastName);
        String[] temp = details.split(",");
        for (int i = 0; i < setters.size(); i++) {
            setters.get(i).accept(temp[i]);
        }
    }

    public String getFirstNameField() {
        return this.firstNameField;
    }

    public void setFirstNameField(String firstNameField) {
        this.firstNameField = firstNameField;
    }

    public String getLastNameField() {
        return this.lastNameField;
    }

    public void setLastNameField(String lastNameField) {
        this.lastNameField = lastNameField;
    }

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "Passenger [firstNameField=" + this.firstNameField +
                        ", lastNameField=" + this.lastNameField +
                        ", firstName=" + this.firstName +
                        ", lastName=" + this.lastName + "]";
    }

}

测试

String details = "passFirst0,passLast0,Molly,Quinn";
Passenger passenger = new Passenger(details);
System.out.println(passenger);

输出

Passenger [firstNameField=passFirst0, lastNameField=passLast0, firstName=Molly, lastName=Quinn]

字符串对象是不可变的 - 您不能更改它们的值 - 在进行赋值时,您正在更改变量(或给定数组索引处的变量)所引用的对象。

当你这样做时:

String[] fields = {firstNameField, lastNameField, firstName, lastName};

您将 fields 数组值的引用设置为 index 0 到 firstNameField 所引用的同一对象(在本例中为 null),index 1 表示与 lastNameField 相同的对象,等等

那么,如果你这样做:

fields[ctr] = temp[ctr];

没有改变对象的值fields[ctr]之前(你的实例变量之一)指的是temp[ctr]的值,但你是将 fields[ctr] 设置为引用同一对象 temp[ctr] 现在正在引用。

如果要将变量作为数组引用,为什么不从一开始就将它们声明为数组?

至于 "how",我最终同意 Andreas 的第一条评论:

public Passenger(String details) {
    String[] temp = details.split(",");

    this.firstNameField = temp[0];
    this.lastNameField = temp[1];
    this.firstName = temp[2];
    this.lastName = temp[3];
}

实现最简单的方法也不错。