簡體   English   中英

如何在Java中實現對象級私有訪問

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM