s*i 发帖数: 388 | 1 java如何保护传入的参数不被函数改动?
类似cpp的
func(SomeDataStructure m_ds) const{}
如何实现? |
X****r 发帖数: 3557 | 2 Java does not have the same 'const' thing as in C++.
Use immutable objects.
【在 s*i 的大作中提到】 : java如何保护传入的参数不被函数改动? : 类似cpp的 : func(SomeDataStructure m_ds) const{} : 如何实现?
|
g*****g 发帖数: 34805 | 3 Make the object immutable by marking every field final,
note if you have to do it on every field object instance as well.
【在 s*i 的大作中提到】 : java如何保护传入的参数不被函数改动? : 类似cpp的 : func(SomeDataStructure m_ds) const{} : 如何实现?
|
N***m 发帖数: 4460 | 4 如果你用别人写好的类该怎么办?
【在 g*****g 的大作中提到】 : Make the object immutable by marking every field final, : note if you have to do it on every field object instance as well.
|
g**e 发帖数: 6127 | 5 clone一个,先serialize,再unserialize
【在 N***m 的大作中提到】 : 如果你用别人写好的类该怎么办?
|
g*****g 发帖数: 34805 | 6 没有啥办法,从OOP的角度讲,谁可以访问接口并改动数据是由
方法的restricter决定的。如果数据不该被改动,那类本身应该
是immutable。如果是有时候可以有时候不可以,那应该由caller
来负责数据的integrity。
【在 N***m 的大作中提到】 : 如果你用别人写好的类该怎么办?
|
N***m 发帖数: 4460 | 7 这个太麻烦了。很奇怪为啥JAVA不搞一个类似于const的东西
【在 g**e 的大作中提到】 : clone一个,先serialize,再unserialize
|
N***m 发帖数: 4460 | 8 为啥不能向C++一样由compiler来判断呢?
【在 g*****g 的大作中提到】 : 没有啥办法,从OOP的角度讲,谁可以访问接口并改动数据是由 : 方法的restricter决定的。如果数据不该被改动,那类本身应该 : 是immutable。如果是有时候可以有时候不可以,那应该由caller : 来负责数据的integrity。
|
s******n 发帖数: 876 | 9
Java designers didn't think it's a useful feature.
Interestingly, "const" is a keyword in Java. The spec says
"The keywords const and goto are reserved, even though they are not
currently used. This may allow a Java compiler to produce better error
messages if these C++ keywords incorrectly appear in programs."
So it was not reserved for possible future come back.
Some people do find "const" useful, and there are libraries that implement
it for Java based on annotations.
Personally I think there is such a thing called too much static constraints,
and const is one of them.
【在 N***m 的大作中提到】 : 为啥不能向C++一样由compiler来判断呢?
|
s*i 发帖数: 388 | 10 final好像是保护你的这个pointer/reference不能被赋值吧?怎么能保护内容呢?
【在 g*****g 的大作中提到】 : Make the object immutable by marking every field final, : note if you have to do it on every field object instance as well.
|
|
|
g*****g 发帖数: 34805 | 11 Of course you can if you do it on the fields and the referenced
instances too.
【在 s*i 的大作中提到】 : final好像是保护你的这个pointer/reference不能被赋值吧?怎么能保护内容呢?
|
N***m 发帖数: 4460 | 12 I see. hehe, although I still feel strange that java designers
didn't view const a useful feature. It is almost certain that introducing
const feature does have advantage just as in c++, then, what makes java
designers think with compromise, i.e.what's the disadvantage of doing so?
constraints,
【在 s******n 的大作中提到】 : : Java designers didn't think it's a useful feature. : Interestingly, "const" is a keyword in Java. The spec says : "The keywords const and goto are reserved, even though they are not : currently used. This may allow a Java compiler to produce better error : messages if these C++ keywords incorrectly appear in programs." : So it was not reserved for possible future come back. : Some people do find "const" useful, and there are libraries that implement : it for Java based on annotations. : Personally I think there is such a thing called too much static constraints,
|
s*i 发帖数: 388 | 13 could u make up an example so we could understand better? thanks a lot!
【在 g*****g 的大作中提到】 : Of course you can if you do it on the fields and the referenced : instances too.
|
g*****g 发帖数: 34805 | 14 If you declare a class and all its fields final, and all fields class
have all fields final recursively, then it's immutable.
【在 s*i 的大作中提到】 : could u make up an example so we could understand better? thanks a lot!
|
c*****t 发帖数: 1879 | 15 const 一个主要问题是 propagation 。C++ 里面某些情况下会出现一行
代码里面需要七八个 const 。写过 container class 人会有感触,为了
一个 const 有 N 个 implementation 。另外的时候 A 是不和
A 兼容的。所以,很多时候 const 弊大于利。
从另外一个方面来看,代码的很多东西其实不能完全靠 signature 来搞定。
有那么多功夫,把 documentation 写好,比如详细的 JavaDoc 会带来更
多的好处。
至于用 serialization / cloning 等办法,是在并行的情况下,弄一个
snapshot 。比如,shoppingCart.getList() 最好弄个 list clone 。
这样,caller 得到 list 后可以干些花时间的事,却不需要一直 lock
该 shoppingCart 。
其实,我觉得 C++ 的 const 其实就是一种变相的 preemptive optimization。
这是 C++ 语言作者 BS 一个 constradiction 。一方面鼓吹不需要
preemptive optimization ,但是另一方面 const 的接触面太广。很多
情况根本没办法避免。
【在 N***m 的大作中提到】 : 这个太麻烦了。很奇怪为啥JAVA不搞一个类似于const的东西
|
X****r 发帖数: 3557 | 16 对,const对于简单的类来说相当于提供了一个几乎免费的对应immutable类,
还是很好用的。但是代码一但复杂涉及多个类的时候,特别是写template库的
情况,多个const的组合形式数目指数增长,还有各种自动转换或匹配的微妙优
先顺序,要保持全const-correctness极为麻烦。还是把immutable类分开
写有确定的界面好处理得多。
【在 c*****t 的大作中提到】 : const 一个主要问题是 propagation 。C++ 里面某些情况下会出现一行 : 代码里面需要七八个 const 。写过 container class 人会有感触,为了 : 一个 const 有 N 个 implementation 。另外的时候 A 是不和 : A 兼容的。所以,很多时候 const 弊大于利。 : 从另外一个方面来看,代码的很多东西其实不能完全靠 signature 来搞定。 : 有那么多功夫,把 documentation 写好,比如详细的 JavaDoc 会带来更 : 多的好处。 : 至于用 serialization / cloning 等办法,是在并行的情况下,弄一个 : snapshot 。比如,shoppingCart.getList() 最好弄个 list clone 。 : 这样,caller 得到 list 后可以干些花时间的事,却不需要一直 lock
|
N***m 发帖数: 4460 | 17 基本同意,呵呵。const如果不滥用的话,应该是没啥大问题的,特别是对于类的
终端使用者而言。相反,如果没有const,一些简单的情况可能会变得复杂。
毕竟,让编译器发现人为失误要好得多。
【在 c*****t 的大作中提到】 : const 一个主要问题是 propagation 。C++ 里面某些情况下会出现一行 : 代码里面需要七八个 const 。写过 container class 人会有感触,为了 : 一个 const 有 N 个 implementation 。另外的时候 A 是不和 : A 兼容的。所以,很多时候 const 弊大于利。 : 从另外一个方面来看,代码的很多东西其实不能完全靠 signature 来搞定。 : 有那么多功夫,把 documentation 写好,比如详细的 JavaDoc 会带来更 : 多的好处。 : 至于用 serialization / cloning 等办法,是在并行的情况下,弄一个 : snapshot 。比如,shoppingCart.getList() 最好弄个 list clone 。 : 这样,caller 得到 list 后可以干些花时间的事,却不需要一直 lock
|
s******n 发帖数: 876 | 18 In C++, const abuses you:)
【在 N***m 的大作中提到】 : 基本同意,呵呵。const如果不滥用的话,应该是没啥大问题的,特别是对于类的 : 终端使用者而言。相反,如果没有const,一些简单的情况可能会变得复杂。 : 毕竟,让编译器发现人为失误要好得多。
|
N***m 发帖数: 4460 | 19 hehe,I escape from c++ now:)
while in java, do not even have such a chance to be abused,sigh:)
【在 s******n 的大作中提到】 : In C++, const abuses you:)
|