基本上,我想确保给定的返回类不能被修改,并且是只读的。这在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;
}
}
s
的声明中添加final
修饰符,以防止其他方法对其进行修改。(加1) - stackerJava不支持对象引用的const修饰。
解决方法包括以下几种:
不可变对象可以防止接收方进行修改,但它们也防止通过任何引用进行修改。它们与C++ const指针/引用不等价。
最接近的是只读接口类型。您可以将一个const-correct C++类映射到两个Java单元,一个接口仅包含const修饰的方法。
这在控制谁可以修改类实例时有时很有用。然而,它并不像在C++中那样经常使用。
“final”关键字表示常量。但是,在Java中使用final与C ++的用法有很大不同。 只有字段或局部变量可以是final。 final类不是const类,而是一种无法继承的封闭类。 final方法是一种密封方法,即无法重写的方法。
在C ++中存在“const类型”的概念,但是在Java中,您仅具有常量字段,常量方法(不可重写)和常量类(不可继承)的概念。
Java不支持C/C++中使用的constness概念。
无法编写与此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
则不太常见。
我认为你想要一个不可变对象。如果一个对象在构造后其状态无法更改,则被视为不可变。
为此,您需要:
确保类不能被覆盖 - 使类为final,或者使用静态工厂并将构造函数保持为private;使字段为private和final强制调用者一次性完全构造对象,而不是使用无参数构造函数结合后续调用setXXX方法;不要提供任何可以以任何方式更改对象状态的方法 - 不仅包括setXXX方法,还包括任何可以更改状态的方法。Java特别舍弃了C++的一些功能,其中之一就是const。这个有意识的决定可以从Java中保留了const
作为保留字(但未使用)来反映。
设计师们可能认为这个功能真的很烦人,而且并不是非常有用。当我还是一个C++程序员时,我也有这种感觉。某些类型的静态检查只是太过于繁琐了。