4

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

1:他们应该在课堂上保持私密吗?

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

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

4

8 回答 8

4

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

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

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

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

于 2012-05-14T16:15:21.243 回答
4

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

to 2 :它们中的许多已经在“幕后”初始化,但你最好自己做

to 3:当然,还有信息隐藏

最好的,弗洛

于 2012-05-14T16:15:31.910 回答
3

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

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

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

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

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

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

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

于 2012-05-14T16:28:48.223 回答
2

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

于 2012-05-14T16:15:37.067 回答
2

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

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

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

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

3:也应该有getter和setter。

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

于 2012-05-14T16:16:12.727 回答
2

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

于 2012-05-14T16:16:28.533 回答
2

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

于 2012-05-14T16:17:12.190 回答
1

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

Regarding initialisation: class reference variables are by default initialised to null. Other than that, they should simply be initialised to whatever value suits the design of you class.

于 2012-05-14T16:38:08.500 回答