繁体   English   中英

为什么从Java和C#中删除const?

[英]Why was constness removed from Java and C#?

我知道这已经讨论了很多次,但我不确定我是否真的理解为什么 Java和C#设计者选择从这些语言中省略这个功能。 我对如何制定变通方法(使用接口,克隆或任何其他替代方法)不感兴趣,而是对决策背后的基本原理感兴趣。

从语言设计的角度来看,为什么这个功能被拒绝了?

PS:我正在使用诸如“省略”之类的词语,有些人可能觉得这些词语不合适,因为C#是用加法(而不是减法)方法设计的。 但是,我使用这样的词是因为在设计这些语言之前C ++中存在这个特性,所以从程序员的工具箱中删除它就省略了。

这次采访中,安德斯说:

Anders Hejlsberg:是的。 关于const,它很有意思,因为我们也一直听到这样的抱怨:“为什么你没有const?” 问题隐含的是,“为什么你没有运行时强制执行的const?” 这正是人们所要求的,尽管他们并没有这样说出来。

const在C ++中工作的原因是因为你可以把它丢弃。 如果你不能把它扔掉,那么你的世界就会糟透了。 如果声明一个采用const Bla的方法,则可以将它传递给非const Bla。 但如果它是相反的方式你不能。 如果声明一个采用非const Bla的方法,则不能将它传递给const Bla。 所以现在你被卡住了。 所以你逐渐需要一个不是const的所有东西的const版本,你最终得到了一个阴影世界。 在C ++中,你可以使用它,因为与C ++中的任何东西一样,无论你是否想要这个检查,它都是纯粹可选的。 如果你不喜欢它,你可以打破常量。

我猜主要是因为:

  • 它无法正确执行,即使在C ++中(你可以强制转换)
  • 底部的单个const可以强制调用树中的整个const链

两者都有问题。 但特别是第一个:如果不能保证,它有什么用? 更好的选择可能是:

  • 不可变类型(完全不变性或冰棒不变性)

至于他们为什么这么做,那些参与者都这么说:

雷蒙德也提到http://blogs.msdn.com/ericgu/archive/2004/04/22/118238.aspx http://blogs.msdn.com/slippman/archive/2004/01/22/61712.aspxhttp://blogs.msdn.com/oldnewthing/archive/2004/04/27/121049.aspx

在多语言系统中,这将非常复杂。

至于Java,你会如何表现这样的属性? 已经存在使对象不可变的技术,这可以说是通过额外的好处实现这一目标的更好方法。 实际上,您可以通过声明仅实现不更改状态的方法的超类/超接口来模拟const行为,然后使用实现变异方法的子类/子接口。 通过将可变类转发到没有写入方法的类的实例,其他代码不能修改对象而不将其专门地转换回可变版本(这相当于抛弃const )。

即使你不希望对象是严格不可变的,如果你真的想要(我不推荐),你可以在它上面设置某种“锁定”模式,这样它只能在解锁时进行变异。 将锁定/解锁方法设置为私有或适当保护,并在那里获得某种级别的访问控制。 或者,如果您不打算将该方法作为参数进行修改,则传入该对象的副本,或者如果复制整个对象太重,那么其他一些轻量级数据对象只包含必要的信息。 您甚至可以使用动态代理为对象创建代理,将任何对变异方法的调用转换为无操作。

基本上已经有很多方法可以防止类被突变,这让你可以选择一个最适合你情况的方法(提示:尽可能选择纯粹的不变性,因为它使对象简单地线程安全并且通常更容易推理)。 没有明显的语义可以实现const是如何实现这些技术的改进,这将是另一件事,要么学习要么缺乏灵活性,要么灵活到无用。

也就是说,除非我错过了什么,这是完全可能的。 :-)

Java有自己的const版本; 最后。 Joshua Bloch在他的Effective Java中描述了如何有效地使用final关键字。 (顺便说一句,const是Java中的保留关键字,用于未来的差异)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM