【问题标题】:Making String private or public in Java在 Java 中将 String 设为私有或公共
【发布时间】:2013-10-15 05:22:56
【问题描述】:

Java 中的字符串被认为是不可变的。 所以如果我说

String one = "myString";

String two = "myString";

在内部,两个对象将使用相同的文字。 现在让我感到困惑的是,为什么我应该在不同的类中将我的字符串设为私有,而在内部它们将引用相同的字符串文字。

仅仅是外部元素(如类或对象)不知道该类内部有哪些成员吗?

【问题讨论】:

  • 好吧,既然它们是不可变的,那么两个不同对象的两个成员是否指向同一个对象并不重要。但是为了防止任何人通过重新分配一个成员变量来改变你对象的内部状态,这就是你将它设为私有的原因。

标签: java string private immutability public


【解决方案1】:

可见性和访问权限实际上只存在于编译期间,以检查您是否能够执行此操作或执行此操作,通常在运行时您可以调用私有方法或通过不同的 hack 更改不可变数据

另外一点:这些字符串是不可变的,所以你不能通过标准方法改变它们的值,所以它们可以在内存中的同一个地方,不管哪个类使用它们

【讨论】:

    【解决方案2】:

    对于String 引用,它并没有真正改变任何东西。这只是约定和封装的问题。如果您的其他字段是私有的并且有 getter 和 setter,为什么不应该使用 String 字段(除非它是要隐藏的)?

    【讨论】:

    • 如果我有公开的gettersetter,那么我也可以更改对其他内容的引用,所以如果是私有的,那么重要的是什么。既然它们在内部使用相同的字符串文字,我为什么要把它们设为私有?
    • @Digvijay Yadiv 你是开发者,所以如果你不想,你不一定要实现setter 方法。您只需使用get 方法即可访问它。 gettersetters 必须成对使用。
    【解决方案3】:

    因为客户可以将您的内部成员设置为完全不同的东西。看起来您可能会将 String 的不可变与引用 final 混淆。

    假设你有这个课程:

    public class MyClass {
        public String first = "Test";
        public String second = "Test";
    }
    

    所以作为 Java 编译器专家,我们知道内部 firstsecond 指的是同一个对象。很酷。

    现在当我使用MyClass:

    MyClass myClass = new MyClass();
    myClass.second = "Time to do some hackin'";
    

    这很糟糕。真的很糟糕。

    声明String 成员private 与失去编译器效率的优势无关。这是关于封装其实现的类,这样它的客户端就不会与它紧密耦合,因此该类不必担心由客户端不负责任的行为引起的奇怪行为。

    对象“Test”是不可变的这一事实并不意味着我不能将firstsecond 更改为指向其他东西。

    希望对您有所帮助。

    【讨论】:

    • 这正是我在问题的最后一行所说的。由于外部世界不会知道内部成员,他们将无法重新分配任何东西。那么重新分配是这里唯一的问题吗?
    【解决方案4】:

    对字符串引用使用私有会阻止来自外部对象的直接访问。但是 setter 和 getter 允许您访问/更改字符串变量(如果您设置了)。但是在 setter 方法中,您可以在更改值之前验证参数。这就是使用 setter 方法的主要优点。

    然后,假设您在两个对象中有两个相等的私有字符串变量。那么这两个引用应该指向字符串池中的一个地方。但这听起来不是你可以从一个对象访问两个字符串(因为你总是使用受私有修饰符限制的引用变量)。

    【讨论】:

      猜你喜欢
      • 2015-05-03
      • 2015-06-09
      • 2022-10-14
      • 2010-12-23
      • 2014-08-21
      • 2015-01-01
      • 2012-01-25
      • 2016-10-18
      • 2013-08-05
      相关资源
      最近更新 更多