【问题标题】:String as only private field for new class字符串作为新类的唯一私有字段
【发布时间】:2011-06-18 07:16:24
【问题描述】:

这里的一般问题:如果我正在创建一个新类,并且它只有私有字段是一个字符串,我可以在构造函数中执行类似this.privateString = argumentIn; 的操作来设置该私有字段吗?我只是厌倦了,因为我不擅长 java 的整个引用部分。

【问题讨论】:

  • 你尝试的时候发生了什么?
  • 已编译,但当时我必须添加几个方法才能进行真正的测试,但事实证明它是正确的 >.
  • 所以如果它编译了你就可以做到。该测试比在论坛上发布要快得多;-)
  • 重点是,您可以引用本地对象,但一旦超出范围,您就不再引用该对象了。我只是想确保我没有意外这样做。

标签: java string constructor immutability private


【解决方案1】:

当然。考虑这个例子。我添加了一些基本的防御性复制练习。

/**
* MyClass is an immutable class, since there is no way to change
* its state after construction.
*/

public final class MyClass{

private final String myString;

public MyClass(String myString){
   this.myString = myString;
}

 /**
  * Returns an immutable object. String is immutable.
  *
  */

public String getMyString(){
   return myString;
}

//no need to provide a setter to keep myString as immutable after initial state
}

考虑阅读 Joshua Bloch 在defensive copying of fields 上的这篇文章。

【讨论】:

    【解决方案2】:

    ,因此私有字段的定义只能从类本身访问。

    作为提示,如果没有任何访问器,这可能会使您的此类的对象大部分无用。

    【讨论】:

    • 我打算使用 .charAt 来挑选字符串的不同部分。感谢您的快速回复:)
    • 如果您的私有字段也是 final,您甚至可以这样做。
    • 确实,如果您不打算更改该领域,出于文体和技术原因,最好将其声明为final。 (后者很难在评论中解释,但当类的实例可能被不同的线程创建和使用时,它会有所帮助。)
    猜你喜欢
    • 1970-01-01
    • 2015-02-09
    • 2021-04-29
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多