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

时间:2011-10-25 19:40:15

标签: java c++ final

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

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

6 个答案:

答案 0 :(得分:19)

  

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

不是直接的,但一种解决方法是immutable object

示例 -

public final Foo{

    private final String s;

    public Foo(String s){
        this.s = s;
    }

    // Only provide an accessor!
    public String getString(){
        return s;
    }
}

答案 1 :(得分:13)

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

变通办法包括以下内容:

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

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

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

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

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

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

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

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

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

答案 4 :(得分:0)

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

要做到这一点,你需要

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

    公共决赛班SomeThing {

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

    }

答案 5 :(得分:-1)

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

设计师可能认为该功能真的很烦人,并没有真正有用。当我是C ++编码器时,我有这种感觉。某种静态检查太过分了。