1

The following code illustrates the situation:

class Human {

 private String heart = "default heart";

    public void control(Human h) {

            h.heart = "$%^&*@@!#^";
      }

   public String getHeart() {
    return heart;
    }
  }

 public class HumanTest {

    public static void main(String[] args) {

    Human deb = new Human();
    Human kate = new Human();

    System.out.println(deb.getHeart());
    kate.control(deb);
    System.out.println(deb.getHeart());

   }

 }

Here heart [private variable] of deb got modified unfortunately. :)

Java allows the code to run without any error.But is it justified to give a object the privilege to access private member of other object even if the code is in the same class ? Shouldn't Java disallow this?

As I know, private means restricting access beyond the class source code. But the same concept is applied in the source code above. and the result is disastrous since a person's heart can't be modified by any random person .

4

6 に答える 6

5

結果が悲惨な場合は、クラスを許可するようにコーディングしないでください。「バグ」は、クラスの外部のコードではなく、クラス自体のコードが原因で発生します。つまり、これは単にコードのバグです。

Javaで許可されていない場合は、同じクラスのオブジェクトをパブリック属性で比較することしかできませんでした。たとえば、カプセル化を破る(プライベートなものを公開する)か、非常に遅くなります(強制的に他のオブジェクトで使用できるようにするためのプライベート属性。

于 2012-04-17T13:28:01.737 に答える
2

一部の言語はオブジェクトレベルでカプセル化され、他の言語(Java、C ++)はクラスレベルでカプセル化されます。オブジェクトレベルでのカプセル化に慣れている(または読んだばかりの)ようです。率直に言って、クラスレベルの方がはるかに自然だと思いますが、おそらくそれは、C++がクラスを使用したプログラミングの概要を提供したからです。クラスレベルのカプセル化により、一部のイディオム(ファクトリメソッド、コピーコンストラクタ、比較演算子)の記述がはるかに簡単になります。オブジェクトレベルのカプセル化を使用すると、これらの機能を実装できるようにするためだけに、実際に必要以上の情報を公開することになります。

いずれにせよ、どちらの方法も「正しい」ものではありません。違いがあるだけです。

于 2012-04-17T13:24:04.500 に答える
0

この状況を回避するために、防御コピーを調べてください。これは、Javaオブジェクトが参照のように動作するためです。'pointer'は変更されませんが、それがわかったら、含まれている値を変更できます。

http://www.informit.com/articles/article.aspx?p=31551&seqNum=2

于 2012-04-17T13:24:23.710 に答える
0

これはオブジェクト指向を壊すことではありません-それはクラスの内部の要素のカプセル化についてです。

この例でこれを行うことができるのはばかげているように見えるかもしれませんが、私が見る限り、実際にはまったく悪いことではありません。クラスの要素をカプセル化するポイントは、他のクラスがそれらを変更できないようにすることHumanです。たとえば、変更を加えるために、クラスのパブリックインターフェイスのみを表示できます。つまり、複数の人が同じプロジェクトで異なるクラスを作成でき(または、同じプロジェクトで異なる時間に異なるクラスを作成でき)、コードの内部動作を知る必要がありません。

ただし、Humanでプライベートフィールドに直接アクセスできる場所(バー反射)は、Humanからのみです。Humanクラスを作成しているときに、他のHumanオブジェクトのプライベートフィールドに変更を加えることを選択した場合、それはあなた次第ですが、すべてがその1つのクラス(デザイン)に含まれています。これを適切でない方法で行う場合、それはJavaではなく、設計の欠陥です。これを行うことが完全に理にかなっている場合があります。

于 2012-04-17T13:27:39.350 に答える
0

まあ、私がそれを見る方法とこれは私用キーワードの私の解釈です、私用はクラスに私用であり、クラス内でアクセスすることができます。クラスのインスタンスに制限されません。したがって、「humantest」クラスでkate.heart = "xpto"を実行すると、プライバシーが侵害されますが、クラス内で処理されるため、kateのコードを使用してdebのハートを変更することは許可されます。

于 2012-04-17T13:29:14.450 に答える
0

オブジェクト指向の概念に厳密に従ったJava言語。ここでもそれは正しいです..ritght?クラスのオブジェクトを使用して、クラスの変数を変更します。しかし、オブジェクトを制御できるのはプログラマー次第です。

人間の心は人間のクラスの中で私的なものです。ただし、制御メソッドを使用すると、外部からアクセスできるようになります。それが変更される理由です..その問題は何ですか?

于 2012-04-17T13:30:52.110 に答える