私有的String还是公共的静态String?

10

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

我所做的是创建仅用于包含值而不具有任何实际功能(除了具有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,因为它是public的,但它也永远不会被改变,因为它是final的。

哪种方法更好?还是将它设置为private但同时又是final的比较好?我是说所有选项都可以工作,显然。我只是想知道哪个更好,为什么。


3
让它私有化。 让它变为最终状态。 - MD Sayem Ahmed
1
Sayem说过,公共成员变量是“有害的”。当您的对象不发生变化时(我们称其为“不可变”),请声明成员变量为final。这将强制您在构造函数中设置它并防止其更改 - 即使有人反射您的类实例。 - Charles Forsythe
6
正如甘道夫对弗罗多所说:“保守秘密,确保安全。” - Tomislav Novoselec
@WereWolfBoy 直接访问变量比通过 getter 方法访问变量速度(可能)更快。 - zapl
@droidhot 这篇文章似乎在说你应该仅将它们用于私有字段访问:“遵循常见的面向对象编程实践,在公共接口中使用getter和setter是合理的,但在类内部,你应该始终直接访问字段。” - jprofitt
显示剩余9条评论
8个回答

8
将变量设为私有,这样你就可以将变量封装在类中。这有很多好处,其中之一就是信息隐藏,如果你点击上面的链接,你就会了解到。如果你希望它在创建后永远不改变,那么也可以将其设置为最终值。

我已经学习了封装。在我的实习中,他们试图教我将其公开,这让我感到很奇怪。为了他们的产品,我仍然会这样做,因为他们自己也这样做。但是对于我的项目,我永远不会这样做。 - WereWolfBoy
@WereWolfBoy:是的,在生产质量的代码中,你应该总是尝试使用私有数据成员。而且,他们在你实习期间教你这个确实有点奇怪(我的意思是你应该在实习期间学习如何编写生产质量的代码,对吧?)。但是,在测试/玩耍/宠物项目中将其公开是可以的,但在生产质量的代码中永远不可以。也许你应该问问他们关于这个问题...... - MD Sayem Ahmed
2
我认为这个人是一个黑客,而不是开发者,可能并不理解他的决定所带来的所有后果。看到他的建议后,我会对他/她今后告诉我的任何事情保持警惕。但是请记住,作为实习生,他们会把你当作不懂自己在说什么的人,所以不要试图争论这一点。 - CodeChimp

4
现在这样做是可行的,因为String是不可变的。但是当你暴露一个对于可变类的引用且该类不是线程安全的时会发生什么?即使你想要返回defensive copy也不行。
更不用说这还会破坏封装性。使用私有变量和getter方法。

1
如果想成为成功的开发者,应该正确、高效地编写程序,最重要的是安全。安全和性能排在第一位。
当您将其公开时,会破坏非常重要且具有许多好处的封装。每次要获取对象属性时,getter都会成为您的朋友。
通常情况下,不应直接访问对象的属性(只有在极端情况下才可以,但这些情况也可以以更好的方式解决)。Getter和Setter用于这些目的-保护封装并安全处理对象。
“final变量”通常用于在一段时间内不可更改的数据。

1
不为变量提供setter方法的想法使其成为只读字段,也就是说,我们只能读取而不能写入,因此使用“final”关键字将其设置为常量,这就是总结。我认为常量更好。 “final”关键字可以提高性能。在这里阅读更多。

1
你应该定义一个getter并将字段设为私有,这就是我们所说的封装。
此外,通过将其设为final以避免setter,你的对象是不可变的,这对于并行编程非常有用。

1
正确使用封装原则的方法是将所有类字段设为私有,通过设置器和获取器进行访问。除此之外,当您调用getName()时,您可能希望添加任何其他逻辑。虽然第二种变体有时会被使用,但第一种更好。希望这可以帮助到您。

1
我猜他们的理由是将其设置为 public 可以使代码更简单。 Java 在此类情况下被批评过于冗长,而在 JavaScript 这样的语言中,这通常会是 public
但这种简化是与安全、稳定和可扩展的代码相抵触的。
要了解为什么这很重要,请看一个大规模 JavaScript 项目,其中每个东西都被写成 public。 每个类的代码可能很简单...但它们之间的关系及其产生的架构最终变成维护的噩梦。

确实,他们制作的许多东西都与网站有关... 包含大量的JavaScript代码。因此,他们在Java / Android中使用它可能是因为这个原因。 - WereWolfBoy

0

我认为这取决于情况。例如:如果您使用getter-您可以重写它。有时候非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接