Java 如何使字符串变量的值在赋值后不发生变化?
如何确保字符串变量的值在赋值一次后不会改变?声明时未进行转让 更清晰:- 字符串x=y;(y是另一个字符串) 即使y改变,x也不应该改变。如何确保这一点 我所尝试的:- 已创建自定义类:-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
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;
}
}