私有字符串还是公共静态字符串?

Posted

技术标签:

【中文标题】私有字符串还是公共静态字符串?【英文标题】:private String or public static String? 【发布时间】:2013-03-18 21:53:43 【问题描述】:

在我实习的时候,我的一位同事给了我一个提示。我想知道这是否是好的做法。

我所做的是创建仅用于它们包含的值的类,并且没有任何实际执行某些操作的函数(除了具有 getter、setter 和构造函数)。我这样声明我的变量:

public class ObjectIUse
  Private String name;

  public ObjectIUse(String name)
    this.name = name;
  

  public String getName()
    return name;
  

所以我没有使用 setter,因为它应该始终保持不变。同事说我也可以这样:

public class ObjectIUse
  public final String name;

  public ObjectIUse(String name)
    this.name = name;
  

因为现在我们不需要任何 getter 或 setter,因为它是公开的,但是它也永远不能更改,因为它是最终的。

哪个更好?还是将其设为私有但也是最终的可能会更好?我的意思是所有选项都有效,显然。我只是想知道哪个更好以及为什么。

【问题讨论】:

将其设为私有。最终确定。 Sayem 所说的。公共成员变量“被认为是有害的”。当你的对象没有改变时(我们说它是“不可变的”),声明成员变量final。这会强制你在构造函数中设置它并防止它改变——即使有人反映了你的类实例。 这也是我认为更好的选择。你的理由是什么? 正如甘道夫对佛罗多所说:“保密,保证安全” 私人最终 BLABLABLA; 【参考方案1】:

将变量设为私有,因为这样做您将成为班级中的encapsulating 变量。这有很多好处,information hiding 就是其中之一,如果您转到上面的链接,您将了解。

如果您希望它在创建后永远不会更改,那么也将其设为 final。

【讨论】:

我已经了解了封装。我觉得他们试图教我在实习时公开这件事很奇怪。我仍然会为他们的产品做这件事,因为他们自己做。但是,我永远不会为自己的项目这样做。 @WereWolfBoy:是的,在生产质量代码中,您应该始终尝试使用私有数据成员。是的,很奇怪他们在你实习的时候教你(我的意思是你应该在实习的时候学习如何编写生产质量的代码,对吧?)。然而,例如,在您的测试/游戏/宠物项目中公开它是可以的,但在生产质量代码中永远不行。也许你应该问他们这个...... 我会说这个人是黑客,而不是开发人员,并且可能不了解他的决定的所有后果。而且,在看到他的建议后,我会对他/她将来告诉我的任何事情感到厌倦。但是,请记住,作为实习生,他们会像对待你一样对待你,就像你不知道自己在说什么一样,所以不要试图争论这一点。【参考方案2】:

我认为这取决于。例如:如果你使用 getter - 你可以覆盖它。有时它非常有用。

【讨论】:

【参考方案3】:

我猜他们的理由是拥有public 可以让代码更简单。 Java 因在这种情况下过于冗长而受到批评。在诸如javascript之类的语言上(通常)总是public

但这种简单性是对安全、稳定和可扩展代码的权衡。

要了解为什么这很重要,请查看一个大型 Javascript 项目,该项目已将所有内容都公开。每个类的代码可能很简单......但它们的关系以及由此产生的架构最终成为维护的噩梦。

【讨论】:

确实,他们制作的很多东西都与网站相关……包含大量的 javascript 代码。所以可能是因为他们在 java/android 中也使用它。【参考方案4】:

哪个更好?或者它可能还是更可取 它是私有的,但也是最终的?

如果您想成为成功的开发人员,您应该正确、高效且安全地进行最重要的编程。安全和性能是第一位的。

当您公开它时,您将打破非常重要且有很多好处的封装。每次你想要获取 Object 的属性时,getter 都会成为你的朋友。

通常您不应该直接访问 Object 的属性(仅在极端情况下,但也可以以更好的方式解决这些问题)。 Getter 和 Setter 被指定用于这些目的 - 保持封装并安全地处理对象。

final variables 通常用于在一段时间内不可更改的数据。

【讨论】:

【参考方案5】:

现在可以使用,因为 String 是不可变的。但是,当您公开对可变类的引用并且该类不是线程安全的时会发生什么?如果你愿意,你甚至不能返回 defensive copy。

更不用说这也破坏了封装。使用私有变量和 getter。

【讨论】:

【参考方案6】:

封装原则的正确使用是将所有类字段设为私有,并通过 setter 和 getter 访问它们。除此之外,您可能希望在调用getName() 时添加任何其他逻辑。虽然有时会使用第二种变体,但第一种更好。希望这会有所帮助。

【讨论】:

【参考方案7】:

您绝对应该有一个 getter 并将您的字段设为私有。这就是我们所说的封装。

此外,通过将其设为 final 并且没有设置器,您的对象是不可变的,这对于并行编程来说是一件非常好的事情。

【讨论】:

【参考方案8】:

不为变量提供setter方法的想法使其成为只读字段,也就是说,这意味着我们只能读取而不能写入,因此通过使用final关键字将其设置为常量总结全部。

我认为常数更好。 final 关键字提高了性能。阅读更多here

【讨论】:

以上是关于私有字符串还是公共静态字符串?的主要内容,如果未能解决你的问题,请参考以下文章

面向对象编程私有类字段+get/set还是公共类字段?

JavaScript,在公共方法中将私有函数作为字符串调用,而不使用 eval(显示模式)

C# 将私有/公共 RSA 密钥从 RSACryptoServiceProvider 导出到 PEM 字符串

是否可以模拟私有静态最终字符串文字?

OGNL setValue 目标为空

导入的 java 类中的公共静态最终变量