java - Java 如何跨实例处理 Final 字段?

标签 java final performance

我有两个类使用相同的 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,你永远无法确定。

附带问题:
我想做的是: Foostr 进行一些处理,并使用 Bar 作为实用程序类。从概念上讲,Foostr 紧密相连,但除了构造函数之外,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/

相关文章:

performance - 在 Apache Spark 上迭代运行查询

java - java中如何将一个函数的返回值接收到另一个函数中

java - 定心 Swing 组件

java - MySQL utf-8 与 json 的问题

java - 私有(private)静态方法中的最终字符串在调用时是否会实例化一个新对象?

java - 如何将 'Double for loop(O(n^2))' 变成 'Single for loop(O(n))' ?

java - 无法在 EC2 实例上加载 AWS 凭证

java - 请看下面的代码。代码运行良好。输出为[10,11]。 Final A a = new A(); 行的含义是什么?

java - 匿名类中的最终变量

android - 保持数据状态 ViewModel