2009-08-18 71 views
5

我知道OOD中的经验法则是最大限度地减少对给定对象的所有成员的访问权限,因为这可以合理完成。C#vs Java中的访问修饰符最佳实践

C#和Java似乎都实现了同一组访问修饰符;然而,现在困扰我一段时间的东西是为什么Java类似乎大部分被声明为公共的,而C#类似乎大部分被声明为默认类。这些语言强加了这些差异还是有一些微妙之处,还是仅仅是一个约定或什么?

我发现自己经常通过我的C#代码(除了内部类,匿名类和其他类的狭义范围和有用性外,我习惯性地将大多数类公开,除了内部类,我可能会错过重要的事情。

+2

(所有评论与它关闭的不完整的事实有关;我删除了它们,因为它们现在没有添加任何关于该问题已修复并重新打开的问题) – 2009-08-18 19:45:29

回答

1

我公开的唯一的东西是static/final变量,它们通常是常量。其他一切都是私有的,并且适当时通过getXXX()和setXXX()方法来完成访问。 setXXX()方法也对数据执行任何验证。如果我必须做出某种保护,我会,但我通常会避免它。

+1

显然,自从我最初发布该问题以来,整个问题已发生变化。 .. – 2009-08-19 01:47:57

+0

是啊我投票了,因为你的回答是正确的,然后我改变了整个事情......它在我完成打字之前实际上保存了。感谢寿! – 2009-08-19 13:27:33

5

我想你回答了你的问题。按照Joshua Bloch的说法,“经验法则很简单,使每个班级或成员都尽可能无法进入。” Effective Java

0

更少的“客户端”(其他代码)知道你的类的内部运作,他将受益更多...简单的抽象规则和面向对象的基本支柱。正确答案已在上面给出:

“经验法则很简单,使每个班级或成员尽可能无法访问。” 〜Joshua Bloch

6

Java's scopingC#'s scoping略有不同。

这是在C# From a Java Developer's Perspective的相同但不同的:Access Modifiers。这份文件现在有些过时,但仍然主要是相关的。

这份名单有两个错误:

  1. C#的internal等同于Java的默认范围(这是它自己的范围内)。 C#的internal protected相当于Java的protected

另外,上面的文档没有提到默认访问修饰符是什么类,只适用于方法和属性/变量。

作为参考,c#中的类的默认范围是内部的。如前所述,Java是其通常的默认范围。

+1

因此,从我收集的内部来看,公共无障碍方面是一步。 java并没有真正的内部公共对于通用目的是有意义的。公共对大多数c#开发没有意义,除非您正在编写一个用于导出的类库。因此默认或内部适用于大多数开发人员。这听起来正确吗? – 2009-08-19 14:27:26

+9

C#的内部和内部保护不等于Java的默认范围或Java的保护。 C#内部类可以从同一个程序集访问。程序集基本上是.exes或.dlls。如果Java允许通过.jar文件访问修饰符,这将是类似的,但是不是。 – FkYkko 2010-09-20 14:50:19