【问题标题】:Primitive and Non Primitive types getters/setters and initialization原始和非原始类型 getter/setter 和初始化
【发布时间】:2012-05-14 16:12:10
【问题描述】:

Java 非原始(对象)数据类型是否以与原始数据类型相同的方式处理?我的意思是治疗......

1 : 他们在课堂上应该是私有的吗?

2 : 是否应该在声明期间将它们初始化为某个值? (例如String S = "" 而不是String S

3 : 他们也应该有 getter 和 setter 吗?

【问题讨论】:

  • 注意String变量被初始化为null所以String s = ""String s有很大不同。
  • "应该有 getter 和 setter" - 一般而言,类成员,无论是否是基元,都不应该有 setter,除非有充分的理由。

标签: java primitive


【解决方案1】:

所有三个问题的简单答案都是“是”。无论所讨论的变量是否属于原始类型,这三种做法都是合理的。

需要注意的一个问题是,如果您有一个对可变对象的引用,并且您的 getter 返回该引用,这可能会允许调用者修改该对象(您认为该对象是您的类私有的!)

这两种情况的另一个区别是对象引用可以设置为null。这可能很有用,但也可能是错误的来源。这里或许值得指出的是,String s = nullString s = "" 并不相同。

最后,对于对象,了解obj1 == obj2obj1.equals(obj2) 之间的区别很重要。原始类型不会出现这种区别,因为只有一种方法可以比较它们是否相等。

【讨论】:

    【解决方案2】:

    to 1:当然,这就是信息隐藏的原理

    到 2 :其中许多已经“在后台”初始化,但你最好自己做

    到 3 :当然还有信息隐藏

    最好的,弗洛

    【讨论】:

    • String.EMPTY 存在于 Java 中吗?
    • 我很确定确实如此。 (我希望我不会在这里混淆语言)
    • 在使用 Java 的这些年里,我从未见过它,也许我是瞎子 :)
    • “拥有 getter 和 setter”与信息隐藏有何关系?对我来说听起来更像是信息展示:-)
    • 信息隐藏意味着不直接暴露变量。这就是 getter 和 setter 的用途。
    【解决方案3】:

    我不知道有任何规则说任何特定属性在类中应该是私有的,Java 提供了其他修饰符,例如 protected 和 public,并且没有暗示包可访问性的修饰符。这些都在那里,以便您可以根据您的设计执行您可能认为合适的不同级别的encapsulation

    关于问题的字段初始化部分,我认为当在类中声明一个字段时,如果该字段是任何引用类型it is by default initialized to null,那么除非您认为有必要,否则您不需要初始化它或除非该字段被声明为 final,这意味着您要将其初始化为默认值。

    关于问题的 getter 和 setter 部分,我相信这些只是强制封装的一种方式。艾伦·斯奈德在他的论文Encapsulation and Inheritance in Object-Oriented Programming Languages 中写道:

    为了最大限度地发挥封装的优势,应该尽量减少 在外部接口中公开实现细节 [...] 例如,面向对象语言的一个特点是它是否 允许设计者定义一个类,使其实例变量 可以重命名而不影响客户端。

    此外,Leonid Mikhajlov 和 Emil Sekerinski 名为 A Study of the Fragile Base Class Problem 的精彩文章可能会展示一些很好的想法,说明为什么所有这些级别的封装和间接都适合避免与继承相关的一些经典问题。

    “不能直接访问基类状态”要求:扩展 类不应直接访问其基类的状态,而只能 通过调用基类方法。

    他们的论文展示了非常有说服力的理由,说明为什么像 getter 和 setter 方法这样的方法可能是避免类扩展脆弱性的好主意。

    【讨论】:

      【解决方案4】:

      所有问题的答案都是“是”。 您在这里描述了数据封装的共同原则和与类型无关的 bean 命名约定。

      【讨论】:

        【解决方案5】:

        1 : 他们在课堂上是否应该是私有的。

        是的。正是出于您应该将原始类型变量声明为私有的原因。

        2 : 它们是否应该在声明期间被初始化一些值(例如:String S = "" 而不是 String S)

        这取决于。如果未初始化状态 (null) 具有特定于应用程序的含义,则默认情况下不应初始化。否则,如果可能,最好初始化为非空默认值。

        3 : 也应该有 getter 和 setter。

        是的。正是出于您应该在原始类型案例中声明 getter 的原因。您还应该声明 setter,但前提是您希望该变量是可设置的。

        【讨论】:

        • 能否请您详细说明“如果未初始化状态 (null) 具有特定于应用程序的含义”
        【解决方案6】:

        明确地说,对象类型变量应该是私有的、已初始化的并具有适当的 getter 和 setter。这允许 OOP 保证我们的代码安全但仍然可以访问。

        【讨论】:

          【解决方案7】:

          1 : 他们在课堂上是否应该是私有的。 是的 2:是否应该在声明期间初始化一些值(例如:String S = "" 而不是 String S) 是的 3:也应该有getter和setter。

          【讨论】:

            【解决方案8】:

            关于1.和3.一般原则是数据封装,它与数据的类型(原始或非原始)没有真正的关系。

            关于初始化:类引用变量默认初始化为null。除此之外,它们应该简单地初始化为适合你的类设计的任何值。

            【讨论】:

              猜你喜欢
              • 2018-08-03
              • 1970-01-01
              • 1970-01-01
              • 2018-08-09
              • 2015-11-15
              • 1970-01-01
              • 1970-01-01
              • 2016-01-21
              • 1970-01-01
              相关资源
              最近更新 更多