0

インスタンスをパラメーターとして関数に渡す状況によく遭遇します。代わりにオブジェクトのパラメーターを転送し、メソッド内で初期化することも同様に可能であることに気付きました。

例:

class MyCanvas extends JComponent {

    private static final long serialVersionUID = 1L;

    private static ArrayList<String>    textData;
    private static ArrayList<Rectangle> rectData;

    @Override

    public void paintComponent(Graphics g) {

        if(g instanceof Graphics2D){

            //Draw the rectangles and text
        }
    }

    public void addText(int x, int y, String text){
        textData.add(text);
    }

    //Do this:
    public void addRect(Rectangle rect){
        rectData.add(rect);
    }

    //Or do this?
    public void addRect(int x, int y, int z,  int q){
        rectData.add(new Rectangle(x, y, z, q);
    }

}

この場合、4 つの整数を渡すと、変動性が減少します。理論的に言えば、脆弱性の可能性とともに、エラーの表面積を減らす必要があります。

JVM はこれら 2 つの例をどのように異なる方法で処理しますか?

エラー/脆弱性が発生しにくいのは本当にありますか?

パフォーマンスの点で、一方は他方よりも効率的ですか?

注: これはデザインの好みに関する質問ではありません。いずれの例も柔軟で効率的な方法でパラメーターをラップまたはバインドする方法は複数あります。私が知りたいのは、バイトコードレベルでの違いと、バイトコードレベルで明らかに効率的/安全であるかどうかです。

4

3 に答える 3

1

アーキテクチャ上のセキュリティと言語上のセキュリティの違いに注意してください。実際、コンピュータ サイエンスの教授のほとんどは、そのことを認識していません。

オブジェクトを「安全に」渡したい場合は、キーボードで暗号化キーの入力を求めることができます。キーを収集します。オブジェクトを暗号化します。そしてそれを渡します。受信関数は、暗号化を再プロンプトして元に戻すことができます! それはすべて、達成しようとしていることに依存します。

オブジェクトの寿命は最大の関心事です。渡されると、パラメーター値はスタックに置かれます。JVM に属するメモリの場所を表示できるオブザーバーを仮定すると、困惑します。したがって、値が取得されたら、その場でガベージで上書きします。私たちはこれを「オブジェクトの再利用」の考慮事項と呼んでいますが、通常、オブジェクトを解放してシステムに戻すときは念頭に置いています。誰かが私たちのアドレス空間を共有していて、ここを覗いたり突いたりし続けていると暗黙のうちに想定しているわけではありません。

于 2016-07-13T15:52:43.110 に答える
1

最初は 4 つの int があり、最後には Rectangle が必要です。要するに、入力を検証して変換を行うのは誰の責任なのかということです。

この特定の例は非常に単純ですが、次を追加することでさらに興味深いものにすることができます。

public void addRect(String rect){
  // e.g. rect = "4 2 3 7"
}  

public void addRect(int[] rect){
  // e.g. rect = [4 2 3 7]
}      

// etc...

その場合、呼び出し元は長方形がどのように構築されるかを気にするべきではなく、それはMyCanvasクラス の仕事であると主張することができます

于 2016-07-13T17:40:35.923 に答える