Java中const(C ++)的等价物

我想知道在Java中是否有相当于c ++的const。 我理解final关键字,但遗憾的是我无法使用它来声明函数返回值final。 相反,它始终确保function不能被覆盖,正确吗?

基本上,我想确保给定的返回类不能被修改并且是只读的。 这可能在Java中吗?

基本上,我想确保给定的返回类不能被修改并且是只读的。 这可能在Java中吗?

不是直接的,但一种解决方法是不可变对象 。

示例 –

 public final Foo{ private final String s; public Foo(String s){ this.s = s; } // Only provide an accessor! public String getString(){ return s; } } 

Java不支持对对象引用的const限定。

解决方法包括以下内容:

  • 不可变的物体。
  • 可修改对象的不可修改视图(例如,Collections.unmodifiable *()返回的视图)。
  • 只读接口类型
  • 防御性副本。

不可变对象阻止接收者修改,但它们也阻止通过任何引用进行修改。 它们不等同于C ++ const指针/引用。

最近的是只读接口类型。 您可以将const-correct C ++类映射到两个Java单元,一个是仅具有const限定方法的接口。

这有时很有用,可以控制可以修改类实例的内容。 但是,它并没有像在C ++中那样频繁地完成。

“final”关键字表示const。 但是java中final的使用与C ++有很大不同,只有字段或局部变量才是最终的。 final类不是const类,而是一个无法inheritance的密封类。 最后一种方法是密封方法,一种不能被覆盖的方法。

在C ++中有“const类型”的概念,但在java中,你只有const字段,const方法(不可覆盖)和const类(不可inheritance)的概念。

没有

Java不支持const的概念,因为C / C ++使用它。

无法编写与此Foo类等效的Java。

 class Foo { public: std::vector& bars( void ) const { return m_bars; } private: std::vector m_bars; }; 

但是,Java有另一种方法,使用接口。

 class Foo { public: ReadonlyList bars( ) { return m_bars; } private: ArrayList m_bars; }; 

Java的final关键字比任何其他c ++概念更类似于Foo * const 。 请注意, Foo const*非常常见且有用,而Foo * const则不那么常见。

我想你想要一个不可变的对象。 如果一个对象的状态在构造后不能改变,则该对象被认为是不可变的。

要做到这一点,你需要

  • 确保不能覆盖类 – 使类最终,或使用静态工厂并保持构造函数私有
  • 使字段私有和最终强制调用者完全在一个步骤中构造一个对象,而不是使用无参数构造函数与后续调用setXXX方法相结合
  • 不提供任何可以以任何方式改变对象状态的方法 – 不仅仅是setXXX方法,而是任何可以改变状态的方法。

    公共决赛classSomeThing {

     public Something(String name) { fname=name } private final String fName; public String getName() { return fName; } 

    }

Java特别放弃了C ++的一些function,const就是其中之一。 这个有意识的决定可以通过const是Java中的保留字(但未使用)这一事实反映出来

设计师可能认为这个function真的很烦人而且不是很有用。 当我是C ++编码器时,我有这种感觉。 某种静态检查太过分了。