我有两个类使用相同的 String
值,并且都将它们存储为最终私有(private)字段。
public class Foo{
private final String str;
private final Bar bar; //notice this
public Foo(String in){
this.str=in;
this.bar=new Bar(in); //option 1
this.bar=new Bar(this.str); //option 2
}
}
这里是Bar
:
public class Bar{
private final String boo;
public Bar(String in){
this.boo=in;
}
}
- Java 是否在各处存储相同的对象,还是为每个实例创建一个副本*?
- 对于选项 1 和 2,您的答案是否相同?
*直觉暗示前者,但对于 Java,你永远无法确定。
附带问题:
我想做的是: Foo
对 str
进行一些处理,并使用 Bar
作为实用程序类。从概念上讲,Foo
和 str
紧密相连,但除了构造函数之外,Foo
并不直接接触 str
再次,但只能通过 Bar
。
我考虑过从 Foo 的字段中删除 str
,因为担心 Java 分配同一个字符串两次,这引发了这个问题。但从软件工程/代码正确性的角度来看,我应该删除它吗?
最佳答案
由于您没有实例化另一个 String 实例,因此您的选项都是相同的引用(在本示例中)。
考虑到您的初始调用,我们可以强制它们具有不同的引用值(我不知道您为什么要这样做,并且会产生后果 - 即增加实习生缓存);
this.str=in;
this.bar=new Bar(in); // option 1
this.bar=new Bar(this.str); // option 2
这将更改引用。
this.str = new String(in); // <-- create a new String from in.
this.bar = new Bar(in); // <-- keeps the original reference to in.
StringBuilder sb = new StringBuilder(in); // <-- create a StringBuilder.
this.bar = new Bar(sb.toString()); // <-- create another String.
关于java - Java 如何跨实例处理 Final 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20533492/