[英]how to implement object-level private access in java
如何使成員字段私有於此特定對象 ? 即,該對象可以讀取和修改值,但是同一類的其他對象則不能。
例如
class Person
{
// don't mind sharing these with other persons :
private integer houseNumber;
private integer telephoneNumber;
// would like this to be *really private*
// (only visible / modifiable to this instance)
private integer bankBalance;
// Lots of code for interaction with other persons:
// (e.g. maintained by co-workers)
void interact1(Person person)
{
//Lots of code
}
void interact2(Person person)
{
//Lots of code
}
//...
void interactN(Person person)
{
//Lots of code
}
}
我知道Java的“私有”訪問權限意味着訪問僅限於此類中的代碼。 從概念上講,該類中的所有代碼都在我的控制之下,所以我對此負責。 控制Person對象對其他Person對象的作用是我的責任。
但是說我有很多與其他人交互的方法,我希望編譯器為我做檢查,而不是親自檢查代碼。 也許此Java文件與同事共享,並且經常更改。
我的問題是-如何在Java中實現“對此對象的私有”訪問? 是否有理智/明智的方式實現這一目標?
編輯-重新強調目標
我想要幾行類設計/代碼,以確保其他Person對象不能讀取/寫入屬於此實例的bankBalance。 我知道它不是真正為Java設計的,但這是我的動機,以了解總體上最干凈的方法是什么。 我真的希望編譯器強制執行它-我不是在尋找涉及審核所有功能的解決方案,以確保它們僅調用正確的getter / access方法。
假設您的目的是防止意外而不是惡意,則可以創建一個單獨的BankBalance類,該類跟蹤誰擁有余額:
class BankBalance {
private int bal;
private Person belongsTo;
public BankBalance (int initialBalance, Person belongsTo) {
this.bal = initialBalance; this.belongsTo = belongsTo;
}
public int getBalance (Person calledBy) {
if (calledBy != belongsTo) throw new RuntimeException ("no peeking");
return bal;
}
}
class Person {
private BankBalance bal;
void checkBalance () {
if (bal.getBalance(this) > 1000) ...
}
}
任何對getBalance
使用都需要調用者傳遞this
。 我認為這可能會使得更難於意外地編寫可達到他人平衡的代碼。 您還可以使BankBalance成為嵌套類,並檢查calledBy != Person.this
而不需要顯式的belongsTo
字段,但這將允許interact1
引用person2.bal.bal
(在BankBalance中將bal
私有仍然不會阻止封閉類以使其無法訪問)。 也許這仍然足以防止發生事故。
正如每個人都指出的那樣,沒有真正的方法可以做到這一點。 您可以做某種形式的吸氣劑
private int getBankBalance(Object caller) {
if (caller == this) {
return bankBalance;
} else {
throw new RuntimeException("GTFO");
}
}
然后強制所有訪問都通過object.getBankBalance(this)
。
但是,這不會阻止人們直接訪問bankBalance
或調用object.getBankBalance(object)
。
您可以聲明一個包含每個“人”余額的余額數組列表。 像這樣:
static int instances = 0;
private int thisInstance = 0;
private List<Integer> balances = new Arraylist<>();
public Person() {
instances++;
thisInstance = instances;
balances.add(thisInstance, new Integer(0));
}
然后,只要您有與bankBalance
交互的代碼,您就只需返回與調用它的實例相同的元素。
例如,如果第五個實例試圖獲得其余額,則該方法將返回數組中的第五個余額。
例如:
private int getBankBalance() {
return balances.get(thisInstance).intValue();
}
這樣一來,任何試圖獲得銀行存款余額的人都只能退還其存款余額,而看不到其他任何人的余額。
我不認為您所采取的方向是正確的方向,如果我是您,我會嘗試從不同的角度看待事情,這是您所要求的一個奇怪的要求。
如果您需要禁止其他對象的屬性訪問,則無法實現。 如果為它指定一個吸氣劑並使用它來引用屬性,則可以這樣做。
實例由其屬性標識,因此您可以編寫一種方法來檢查某些屬性,然后使用它來確定某個對象是否可以訪問該屬性訪問器。
因此,總結起來就是這樣:
private boolean isBankBalanceAccessible() {
// check that properties are those you want,
// for example only when houseNumber is 1234567890
return houseNumber == 1234567890;
}
private int getBankBalance() {
if (isBankBalanceAccessible()) {
return bankBalance;
} else {
// maybe throw here?
}
}
我想到了這個
void interact1(Person person)
{
if(this==person)
{
person.bankBalance
// Do here with the balance of the objecct which calls this function
}
//rest code here
}
希望它能工作.. !!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.