gpt4 book ai didi

java - 引用变量的封装?

转载 作者:搜寻专家 更新时间:2023-11-01 02:05:29 24 4
gpt4 key购买 nike

这可能是一个常见问题,但我找不到很好的解释。我试图理解 Java 中的引用变量的封装
在下面的代码中:

class Special {
private StringBuilder s = new StringBuilder("bob");
StringBuilder getName() { return s; }
void printName() { System.out.println(s); }
}
public class TestSpecial {
public static void main (String[] args ) {
Special sp = new Special();
StringBuilder s2 = sp.getName();
s2.append("fred");
sp.printName();
}
}

输出:bobfred

起初我想将我们的字段设为private 并提供一个getter 方法,这是一种很好的封装技术。但是当我仔细观察它时,我发现当我调用 getName() 时,我实际上返回了一个副本,就像 Java 总是做的那样。但是,我不会返回 StringBuilder 对象的副本。我正在返回指向一个且唯一的 StringBuilder 对象的引用变量的副本。因此,在 getName() 返回时,我有一个 StringBuilder 对象和两个指向它的引用变量 (s 和 s2)。

有哪些技巧可以很好的封装??一个很好的解释与代码示例预期 :) 。提前致谢。

最佳答案

我能想到两种基本方法。

第一个是只返回不可变值。然后,调用者可以做他想做的事,而不会危及您的对象的完整性。在您的情况下,不可变类型将是 String:

class Special {
private String s = "bob";
String getName() { return s; }
void printName() { System.out.println(s); }
}
public class TestSpecial {
public static void main (String[] args ) {
Special sp = new Special();
String s2 = sp.getName();
s2 += "fred";
// Alternatively: StringBuilder s2 = new StringBuilder(sp.getName()).append("fred");
sp.printName(); // prints "bob"
}
}

注意:如果s需要是一个StringBuilder,你可以返回s.toString()

另一种选择是返回一个可变值,但在您的 getter 中创建一个防御性副本。换句话说,返回一个包含重复数据的单独引用:

class Special {
private StringBuilder s = new StringBuilder("bob");
StringBuilder getName() { return new StringBuilder(s); } // return a copy of s
void printName() { System.out.println(s); }
}
public class TestSpecial {
public static void main (String[] args ) {
Special sp = new Special();
StringBuilder s2 = sp.getName();
s2.append("fred");
sp.printName(); // prints "bob"
}
}

关于java - 引用变量的封装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35533337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com