Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使字符串变量的值在赋值后不发生变化?_Java_Android_String_Final - Fatal编程技术网

Java 如何使字符串变量的值在赋值后不发生变化?

Java 如何使字符串变量的值在赋值后不发生变化?,java,android,string,final,Java,Android,String,Final,如何确保字符串变量的值在赋值一次后不会改变?声明时未进行转让 更清晰:- 字符串x=y;(y是另一个字符串) 即使y改变,x也不应该改变。如何确保这一点 我所尝试的:- 已创建自定义类:- public class MyDs { private final String unitName; public MyDs(String iUnitName){ unitName = iUnitName; } public String getU

如何确保字符串变量的值在赋值一次后不会改变?声明时未进行转让

更清晰:-

字符串x=y;(y是另一个字符串) 即使y改变,x也不应该改变。如何确保这一点

我所尝试的:-

已创建自定义类:-

public class MyDs {
    private final String unitName;

    public MyDs(String iUnitName){
        unitName   =   iUnitName;

    }

    public String getUnitName(){
        return unitName;
    }
}
在主要方法中:-

String iName = "xyz";

MyDs MyDsObj  = new MyDs(iName);
但即使在这之后,值也会随着变量的变化而变化


如何解决此问题?

将MyDs类更改为singleton类

将其设置为单例类可以确保最后的字符串
unitName
只更新一次,然后就不能再修改了

public class MyDs {
    private final String unitName;
    private static MyDs myDs;

public static MyDs getMyDsObject(String iUnitName) {
    if (myDs == null) {
        myDs = new MyDs(iUnitName);
    }
    return myDs;
}

private MyDs(String iUnitName) {
    unitName = iUnitName;

}

public String getUnitName() {
    return unitName;
}

}
这里的值“xyz”存储在
unitName
中,当您更改为“zxy”时,不会再次更新


您的类应该按照下面代码中所述进行设计

公开课考试{

private String name;

public void setName(String name) {
    if (this.name == null && name != null)
        this.name = name;
}

public String getName() {
    return name;
}
}

现在使用下面的代码进行测试

   TestingClas testingClas = new TestingClas();
    testingClas.setName("Abdul Waheed");
    testingClas.setName("You cannot change me any more now");

    String updatedString = testingClas.getName();

updatedString变量将具有旧值

,据我所知,您应该以变量为最终变量的方式设计类。使用这种方法,您可以在构造函数中设置它,然后没有任何东西可以使它发生更改。即使它所持有的引用被更改,值也保持不变,我的意思是在堆中创建一个新对象,并且最终变量的值保持不变。下面是一种设计,它使变量x设置一次,以后再也不能更改。当然,这是在实例范围内,对于类范围,您可以使您的类成为Singleton等

public class Test {

    private final String x;
    private String y;


    public Test(String x){
        this.x=x;
    }

    public String getY() {
        return y;
    }

    public void setY(String y) {
        this.y = y;
    }

    public String getX() {
        return x;

    }

}

好吧,你的问题不是很清楚(评论部分也很健谈……),但是如果你想只设置一次值,而不是在初始化过程中设置,那么设置器是一个不错的选择。只需添加一个约束

public class MyClass{

    private static final String DEFAULT_VALUE = new String("");

    private String value = DEFAULT_VALUE;

    public final void setValue(String value){
        if(this.value != DEFAULT_VALUE) //use the reference on purpose
            throw new IllegalArgumentException("This value can't be changed anymore");

        this.value = value;
    }

    // Don't return `DEFAULT_VALUE` to prevent someone to gain access to that instance
    public final String getValue(){            
        return this.value == DEFAULT_VALUE ? null : this.value;
    }
}
这将在运行时完成,但这样做就可以了


现在,这是一个不可变的实例,对于某些可变实例,您可能需要复制它,以确保它不能使用原始引用进行修改。

请提供更多信息您试图询问的内容不太清楚了解此类是否正确。您正在构造函数中赋值。由于字段为final.@SreekanthKarumanaghat在Java中所有字符串都是不可变的。这意味着他们的内容不能改变。您认为您看到了一个变化,但它一定是另外一个变化。@SreekanthKarumanaghat注释()中的链接谈到了引用可变对象的最后一个变量。字符串是不可变的。因此,不能将final字符串变量更改为引用其他对象(因为它们是final的),也不能更改它们引用的对象(因为它是不可变的)。您还没有理解这个问题。我的问题是字符串myStringVar=“xyz”;testingClas.setName(myStringVar);稍后将myStringVar的值更改为myStringVar=“abc”;然后执行testingClas.getName(),它返回“abc”,而我想要的是“xyz”,请尝试我的代码,它不会返回abc。您的代码与我在问题中发布的代码在效果上有何不同?我不是在构造函数中发送值,而是在设置之前进行检查。这就是我的代码的不同之处你认为在这种情况下会有什么不同吗?在这种情况下,这与我在问题中发布的代码有什么不同?类是singleton,对象只创建了一次。我在studio中对此进行了测试,所以我问你这是否是你想要的singleton不应该有公共构造函数…@AxelH谢谢你提醒我:)
public class MyClass{

    private static final String DEFAULT_VALUE = new String("");

    private String value = DEFAULT_VALUE;

    public final void setValue(String value){
        if(this.value != DEFAULT_VALUE) //use the reference on purpose
            throw new IllegalArgumentException("This value can't be changed anymore");

        this.value = value;
    }

    // Don't return `DEFAULT_VALUE` to prevent someone to gain access to that instance
    public final String getValue(){            
        return this.value == DEFAULT_VALUE ? null : this.value;
    }
}