2

この特定のオブジェクトに対してメンバー フィールドを非公開にするにはどうすればよいですか? つまり、このオブジェクトは値を読み取って変更できますが、同じクラスの他のオブジェクトはできません。

例えば

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 用に設計されたものではないことはわかっていますが、一般的にそれを達成するための最もクリーンな方法は何かを知りたいというのが私の動機の一部です。私は本当にコンパイラにそれを強制してもらいたいです-すべての関数を監査し、正しいゲッター/アクセスメソッドのみを呼び出すことを確認するソリューションを探していません.

4

5 に答える 5

1

誰もが指摘したように、これを行う実際の方法はありません。あなたはフォームのゲッターのようなことをすることができます

private int getBankBalance(Object caller) {
     if (caller == this) {
          return bankBalance;
     } else {
          throw new RuntimeException("GTFO");
     }
}

そして、すべてのアクセスが 経由で行われることを強制しますobject.getBankBalance(this)

bankBalanceただし、これは人々が に直接アクセスしたり を呼び出したりするのを止めるものではありませんobject.getBankBalance(object)

于 2013-08-05T16:31:49.677 に答える
0

各個人の残高を含む残高の配列リストを宣言できます。このようなもの:

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それを呼び出したインスタンスと同じ要素を返すだけです。

たとえば、5 番目のインスタンスが残高を取得しようとすると、メソッドは配列内の 5 番目の残高を返します。

例えば:

private int getBankBalance() {
   return balances.get(thisInstance).intValue();
}

これにより、銀行の残高を取得しようとする人は自分の残高のみが返され、他の人の残高を見ることはできなくなります。

于 2013-08-05T16:05:57.423 に答える
0

あなたが取っている方向が正しいとは思いません。私があなただったら、別の角度から物事を見ようとするでしょう。あなたが求めているのは奇妙な要件です。

他のオブジェクトからのプロパティへのアクセスを禁止する必要がある場合、それを達成することはできません。ゲッターを指定し、それを使用してプロパティを参照すると、それを行うことができます。

インスタンスはその属性によって識別されるため、特定のプロパティをチェックするメソッドを作成し、それを使用して特定のオブジェクトがそのプロパティ アクセサーにアクセスできるかどうかを判断できます。

要約すると、次のようになります。

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?
    }
}
于 2013-08-05T16:06:05.283 に答える
0

私はこれについて考えました...

     void interact1(Person person)
      {
         if(this==person)
          {
             person.bankBalance
             // Do here with the balance of the objecct which calls this function
          }


          //rest code here
      }

それがうまくいくことを願っています.. !!

于 2013-08-05T16:31:25.253 に答える