C#与Java中的访问修饰符最佳实践

Bri*_*ney 7 c# java oop access-modifiers

我理解OOD中的经验法则是尽量减少对给定对象的所有成员的访问,尽可能合理地完成.

C#和Java似乎都实现了同一组访问修饰符; 然而,令我困惑一段时间的东西现在是为什么Java类似乎主要被声明为公共,而C#类似乎主要被声明为默认. 这些语言是否有一些微妙之处可以强加这些差异,还是仅仅是一个惯例或什么?

我发现自己经常通过我的C#代码(我习惯性地将大多数类公开,除了内部类,匿名类,以及其他类别的狭窄范围和有用性)以试图取悦编译器,但是我想知道我是否可能遗漏了某些东西重要.

小智 6

我想你回答了你的问题.按照约书亚布洛赫的说法,"经验法则很简单,使每个阶级或成员尽可能无法进入." 有效的Java


Pow*_*ord 6

Java的范围C#的范围略有不同.

C#中简要介绍了这一点,来自Java Developer's Perspective的The Same,But Different:Access Modifiers.这份文件现在略有陈述,但仍然是最相关的.

该列表有两个错误:

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

另外,上面的文档没有提到类的默认访问修饰符,仅用于方法和属性/变量.

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

  • C#的内部和内部保护不等同于Java的默认范围或Java的受保护.可以从同一个程序集访问C#内部类.程序集基本上是.exes或.dll.如果Java允许.jar文件的访问修饰符,这将是类似的,但事实并非如此. (9认同)

Tho*_*ens 1

我唯一公开的是静态/最终变量,它们通常是常量。其他一切都是私有的,并且在适当的时候通过 getXXX() 和 setXXX() 方法完成访问。setXXX() 方法还对数据执行任何验证。如果我必须保护某些东西,我会的,但我通常会避免这样做。