avatar
请问protected的使用# Java - 爪哇娇娃
p*p
1
定义我大概清楚,就是本包和继承它的可以使用。请问在OOP里面代表了一种什么思想呢
?我的理解是,比如现在我编写服务器程序,就是所有内部操纵的Method和变量都应该是
protected的,这样用户即使undercast也无法使用他们,只有API的是public的。另外就
是凡是用户能得到的全部用wrapper包起来。
不过我看看商业程序的源代码,发现里面大把的public,只有和启动、设置classloader
这些有关的才是protected,不会有安全问题么?
感觉设置成private和public都比较好把握,就是protected比较困难。我现在的办法是全
设置成protected和private,使用过程中如果需要,就改成public。
avatar
g*g
2
protected, as well as public, is a commitment for later code
if you are writing an api. Once released, it's part of legacy
and you can't change the interface without concern.
Use private and default as much as possible, those methods
that may be extended later on by others, can be claimed protected




classloader


【在 p***p 的大作中提到】
: 定义我大概清楚,就是本包和继承它的可以使用。请问在OOP里面代表了一种什么思想呢
: ?我的理解是,比如现在我编写服务器程序,就是所有内部操纵的Method和变量都应该是
: protected的,这样用户即使undercast也无法使用他们,只有API的是public的。另外就
: 是凡是用户能得到的全部用wrapper包起来。
: 不过我看看商业程序的源代码,发现里面大把的public,只有和启动、设置classloader
: 这些有关的才是protected,不会有安全问题么?
: 感觉设置成private和public都比较好把握,就是protected比较困难。我现在的办法是全
: 设置成protected和private,使用过程中如果需要,就改成public。

avatar
g*y
3
那个定义实际上就说明了用法。在程序不再考虑修改(或扩展)时,一个method应该是
private还是protected是很清楚的,不会出现难确定。当然,一个class还不知道会不会
有subclass时,有些method用private或protected都可以,原则是可能被subclass用的用
protected修饰。但肯定的一点是,final class是不应该有protected的method或
variable的。
protected variable是有用的,跟protected method一样,用来在subclass里使用这个
variable,因为private的variable不会被继承,所以在有些时候肯定是需要protected
variable的。
对于public method,不是尽量避免expose过多的method,而是一个method该是public就
public,这个public method是给别的class(可能同package,也可能不用package)用的
,给同一个package里用的用default scope,给subclass用的
avatar
c*t
4
你这说的无非是定义。实际上什么是 private 什么是 protected 这之间很多情况
下很难确定。
用 protected variable 本身是个错误,是要尽量避免的。package scope variable
也要避免。
至于 protected function ,我个人认为一开始最好所有不是 public 的 function
都是 private ,然后根据需要才慢慢变成 protected 。特别是在写 API 的时候,
要尽量避免 expose 过多的 function,对今后的改动会有很大的限制。很多情况下,
使用 function object 可以替代 protected ,其实就是手动的 polymorphism。
我对 package scope 的 function 用的不多,一般都是 package scope 的 class。




【在 g****y 的大作中提到】
: 那个定义实际上就说明了用法。在程序不再考虑修改(或扩展)时,一个method应该是
: private还是protected是很清楚的,不会出现难确定。当然,一个class还不知道会不会
: 有subclass时,有些method用private或protected都可以,原则是可能被subclass用的用
: protected修饰。但肯定的一点是,final class是不应该有protected的method或
: variable的。
: protected variable是有用的,跟protected method一样,用来在subclass里使用这个
: variable,因为private的variable不会被继承,所以在有些时候肯定是需要protected
: variable的。
: 对于public method,不是尽量避免expose过多的method,而是一个method该是public就
: public,这个public method是给别的class(可能同package,也可能不用package)用的

avatar
g*y
5
public method是一个class给其它class调用的interface,当且仅当一个method需要这样
的access属性时,才用public。
private method时一个class内部自己用的,不能subclass被override,对subclass也不
可见。
protected method对subclass是可见的,并且在subclass里可以override。一个base
class里的protected method可以看作是这个class给subclass用的interface。
一个method不是使用过程中有需要才改public,而是要设计时就想好这个class需要提供
什么用的功能,别的class如何使用它,有可能会怎样扩展它的功能。




classloader
Family M.1136428243.j0 yokel uuuu 大家发现没有?
Joke M.1136428270.Z0 redpearl redpearl Re: 全國各地“石頭剪子佈”叫法徴集zt
Family M.1136428251.o0 dude lost R

【在 p***p 的大作中提到】
: 定义我大概清楚,就是本包和继承它的可以使用。请问在OOP里面代表了一种什么思想呢
: ?我的理解是,比如现在我编写服务器程序,就是所有内部操纵的Method和变量都应该是
: protected的,这样用户即使undercast也无法使用他们,只有API的是public的。另外就
: 是凡是用户能得到的全部用wrapper包起来。
: 不过我看看商业程序的源代码,发现里面大把的public,只有和启动、设置classloader
: 这些有关的才是protected,不会有安全问题么?
: 感觉设置成private和public都比较好把握,就是protected比较困难。我现在的办法是全
: 设置成protected和private,使用过程中如果需要,就改成public。

avatar
c*t
6
你这说的无非是定义。实际上什么是 private 什么是 protected 这之间很多情况
下很难确定。
用 protected variable 本身是个错误,是要尽量避免的。package scope variable
也要避免。
至于 protected function ,我个人认为一开始最好所有不是 public 的 function
都是 private ,然后根据需要才慢慢变成 protected 。特别是在写 API 的时候,
要尽量避免 expose 过多的 function,对今后的改动会有很大的限制。很多情况下,
使用 function object 可以替代 protected ,其实就是手动的 polymorphism。
我对 package scope 的 function 用的不多,一般都是 package scope 的 class。




【在 g****y 的大作中提到】
: public method是一个class给其它class调用的interface,当且仅当一个method需要这样
: 的access属性时,才用public。
: private method时一个class内部自己用的,不能subclass被override,对subclass也不
: 可见。
: protected method对subclass是可见的,并且在subclass里可以override。一个base
: class里的protected method可以看作是这个class给subclass用的interface。
: 一个method不是使用过程中有需要才改public,而是要设计时就想好这个class需要提供
: 什么用的功能,别的class如何使用它,有可能会怎样扩展它的功能。
:
: 呢

avatar
g*y
7
OOP要求能封装尽量封装,不该给别的class用的method一定不能让别的class access。我
们对于一些公用的interface都要写wrapper,只提供用户他们需要用的的method。如标准
的JMS interface里用户可以用一个public的method create topic,我们不想让用户有这
样的功能,所以wrapper里就没有这个method。在那些要求很高的软件里,让用户用了不
该用的method,后果有时很严重的。
你看tomcat 的每一个public method,确实都是需要public的吗?可以改成protected或
private吗?里面用protected的地方,可以改成private嘛?

methods

【在 p***p 的大作中提到】
: 定义我大概清楚,就是本包和继承它的可以使用。请问在OOP里面代表了一种什么思想呢
: ?我的理解是,比如现在我编写服务器程序,就是所有内部操纵的Method和变量都应该是
: protected的,这样用户即使undercast也无法使用他们,只有API的是public的。另外就
: 是凡是用户能得到的全部用wrapper包起来。
: 不过我看看商业程序的源代码,发现里面大把的public,只有和启动、设置classloader
: 这些有关的才是protected,不会有安全问题么?
: 感觉设置成private和public都比较好把握,就是protected比较困难。我现在的办法是全
: 设置成protected和private,使用过程中如果需要,就改成public。

avatar
p*p
8
Thanx all. the problem is that, I checked Tomcat and Jetty source, 90% methods
are public.....

【在 g****y 的大作中提到】
: OOP要求能封装尽量封装,不该给别的class用的method一定不能让别的class access。我
: 们对于一些公用的interface都要写wrapper,只提供用户他们需要用的的method。如标准
: 的JMS interface里用户可以用一个public的method create topic,我们不想让用户有这
: 样的功能,所以wrapper里就没有这个method。在那些要求很高的软件里,让用户用了不
: 该用的method,后果有时很严重的。
: 你看tomcat 的每一个public method,确实都是需要public的吗?可以改成protected或
: private吗?里面用protected的地方,可以改成private嘛?
:
: methods

avatar
g*y
9
举一个实际的例子,你要写一个Queue class,这个class需要有queue的功能:pop(), 弹
出queue最前面的一个object;put(obj),将一个object放入queue尾。java.util.
ArrayList()有queue的这些功能,现在你想用ArrayList实现这个queue class,你怎样实
现呢?class Queue extends ArrayList? or use object adapter?
avatar
g*y
10
那个定义实际上就说明了用法。在程序不再考虑修改(或扩展)时,一个method应该是
private还是protected是很清楚的,不会出现难确定。当然,一个class还不知道会不会
有subclass时,有些method用private或protected都可以,原则是可能被subclass用的用
protected修饰。但肯定的一点是,final class是不应该有protected的method或
variable的。
protected variable是有用的,跟protected method一样,用来在subclass里使用这个
variable,因为private的variable不会被继承,所以在有些时候肯定是需要protected
variable的。
对于public method,不是尽量避免expose过多的method,而是一个method该是public就
public,这个public method是给别的class(可能同package,也可能不用package)用的
,给同一个package里用的用default scope,给subclass用的

【在 c*****t 的大作中提到】
: 你这说的无非是定义。实际上什么是 private 什么是 protected 这之间很多情况
: 下很难确定。
: 用 protected variable 本身是个错误,是要尽量避免的。package scope variable
: 也要避免。
: 至于 protected function ,我个人认为一开始最好所有不是 public 的 function
: 都是 private ,然后根据需要才慢慢变成 protected 。特别是在写 API 的时候,
: 要尽量避免 expose 过多的 function,对今后的改动会有很大的限制。很多情况下,
: 使用 function object 可以替代 protected ,其实就是手动的 polymorphism。
: 我对 package scope 的 function 用的不多,一般都是 package scope 的 class。
:

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。