In the book Java The Complete Reference, Eleventh Edition by Herbert Schildt, in the chapter about encapsulation, there is a caption that says:
public methods can be used to protect private data.
How would a public method protect some private data?
答案 0 :(得分:1)
直接来自书中:
私有方法和数据只能由属于该类成员的代码访问。因此,不是该类成员的任何其他代码都不能访问私有方法或变量。由于班级的私有成员只能由班级的其他部分通过班级的公共方法访问,因此您可以确保不进行任何不当操作。当然,这意味着应该精心设计公共接口,以免暴露过多的类内部工作。
就像我在上面的评论中说的那样,您可能已经编写了可能会被公众使用的API。由于某些原因,您不想公开类的内部工作(通常是通过让接口仅指定要公开的公共方法并让类实现该接口来完成的。API用户)会使用您的界面创建一个实例,因此只能访问您指定的可公开使用的方法,这并不像我看上去的那么简单,它包括使用诸如Java RMI Registry Naming Service之类的名称注册服务,但我只想您可以了解主要思想)。
您要做的就是像赫伯特·希尔德(Herbert Schildt)所描述的那样简单。除了要公开的方法外,类中的所有内容实际上都是私有的。保护任何敏感数据。
请参见下面两个必须协同工作的Java不同类的简单示例:
public class BankAccount{
/*This is my money (for monetary amounts BigInteger is used, but this is an example)
Of course, I don't want anyone to have direct access to this value!
It's my money after all! What happens when the BankManager needs to check
how much money I have, to approve me for a loan?*/
private int balance = 900;
/*This is where an accessor method comes into play! While BankManager
is unable to access a private field, like my balance, he will be
able to access a PUBLIC METHOD, which will return the value of my balance!
Remember, Java is pass-by-value, so I will return just the value '900', not
the actual pointer to the variable in memory*/
public int getBalance(){
return this.balance;
}
}
public class BankManager{
/*Let's assume that BankAccount instance has already been created
named as "pedrosAccount"*/
//Then we can do
public int pedrosBalance = pedrosAccount.getBalance();
}
如您所见,从上面的示例中可以看到,银行经理现在可以创建一个本地变量来保存我的钱。他可以执行该变量需要执行的任何操作,而该操作不会更改BankAccount中的变量。如果经理可以用我的钱来编辑变量,那意味着如果他愿意,他可以窃取所有变量。
您现在看到了,我们如何通过一种公共方式保护我的所有资金免受(可能是贪婪的)银行经理的侵害?