原始和非原始类型getter / setter和初始化

时间:2012-05-14 16:12:11

标签: java primitive

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

1:他们应该在课堂上私下吗?

2:在宣言期间是否应该将它们初始化为某个值? (例如String S = ""代替String S

3:他们也应该有吸气剂和二传手吗?

8 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:4)

到1:当然,这是信息隐藏的原则

到2:他们中的许多人已经在“引擎盖下”进行了初始化,但你应该自己做得更好

到3:当然也是信息隐藏

Best,Flo

答案 2 :(得分:3)

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

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

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

  

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

Leonid Mikhajlov和Emil Sekerinski发表的伟大文章A Study of the Fragile Base Class Problem也可能证明了为什么所有这些级别的封装和间接都适合避免一些与继承相关的经典问题的好主意。

  

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

他们的论文证明了为什么像getter和setter方法这样的东西可以避免类扩展脆弱性的非常令人信服的理由。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

  

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

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

  

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

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

  

3:也应该有吸气剂和二传手。

是。正是因为你应该在原始类型的情况下声明getter。您还应该声明setter,但前提是希望变量可以设置。

答案 5 :(得分:2)

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

答案 6 :(得分:2)

1:他们是否应该在课堂上私密。 2:它们是否应在声明期间初始化一些值(例如:String S =“”而不是String S) 3:也应该有吸气剂和二传手。 的

答案 7 :(得分:1)

关于1.和3.一般原则是数据封装,它与数据类型(原始或非原始)无关。

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