返回信息流java能不能 返回一个 不可修改的 可变对象。。。。。。。。。
不知道有没有说对,比如如下c++代码
class Wallet {
private:
int _money;
public:
Wallet(int money) : _money(money) {}
void setMoney(int money) {
this->_money = money;
}
int getMoney () const {
return this->_money;
}
};
class Person {
private:
Wallet _wallet;
public:
Person() : _wallet(0) {}
const Wallet& getWallet() const {
return this->_wallet;
}
};
int main() {
Person p;
cout << p.getWallet().getMoney() << endl;
const Wallet& wallet = p.getWallet();
wallet.setMoney(100); // 很明显 这一句会报错;但是如果wallet没有const修饰 上一句又会报错
cout << p.getWallet().getMoney() << endl;
return 0;
}
而用java写的话,怎样才能让getWallet 返回的引用不能被修改呢。。。。。
public class Hello {
public static void main(String[] argv) {
Person p = new Person();
System.out.println(p.getWallet());
Wallet wallet = p.getWallet();
wallet.setMoney(100);//如何能让 这一句 报错。。。?
System.out.println(p.getWallet());
}
}
class Person {
private Wallet wallet;
public Person() {
wallet = new Wallet(0);
}
public Wallet getWallet() {
return wallet;
}
}
class Wallet {
private int money;
public Wallet(int money) {
this.money = money;
}
public void setMoney(int money) {
this.money = money;
}
public String toString() {
return "" + money;
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #35548同步于 2014/10/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
java新人求问
buptxrc
2014/10/23镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
如果wallet本身的setMoney方法不能去掉,那么就用proxy模式吧。
interface Wallet {
int getMoney();
}
class WalletImpl implements Wallet {
private int money;
public Wallet(int money) { this.money = money; }
public void setMoney(int money) { this.money = money; }
public @Override int getMoney() { return this.money; }
}
class ReadOnlyWalletProxy implements Wallet {
private Wallet realWallet;
public ReadOnlyWalletProxy(Wallet realWallet) { this.realWallet = realWallet; }
public @Override int getMoney() { return realWallet.getMoney(); }
}
那getWallet()就是这么实现?:
return new ReadOnlyWalletProxy(this.wallet);
通过代码设计的技巧来弥补语法的功能,妙,学习了
【 在 nuanyangyang 的大作中提到: 】
: 如果wallet本身的setMoney方法不能去掉,那么就用proxy模式吧。
: [code=java]
: interface Wallet {
: ...................
简单地说。。。。就是不能easy的 返回一个 不可修改的 可变对象。
是吧。。
【 在 nuanyangyang 的大作中提到: 】
: 如果wallet本身的setMoney方法不能去掉,那么就用proxy模式吧。
: [code=java]
: interface Wallet {
: ...................
final修饰的变量必须在声明的时候初始化,之后就不能改变了,lz说只是这个函数返回的对象不可变,并不代表该变量在任何地方都不能修改,我觉的用final不太合适
【 在 lixing 的大作中提到: 】
: 暖神说的方法,一直是我没理解的代理模式。。。
: 还有个简单的方法,给money设final,这样就不能改变了
【 在 ffantastic 的大作中提到: 】
: final修饰的变量必须在声明的时候初始化,之后就不能改变了,lz说只是这个函数返回的对象不可变,并不代表该变量在任何地方都不能修改,我觉的用final不太合适
额,是我理解粗浅了,见笑了[ema1]