1

Java コードのベースラインをアップグレードして、適切なセキュリティ プラクティスに従い、ジェネリックに関連する問題が発生するように取り組んでいます。次のものがあるとします。

public class SomeClass<T>
{
    private T value;
    public T getValue()
    {
        return value;
    }

    public void setValue(T value)
    {
        this.value = value;
    }
}

これらのメソッドを編集して、Clonable を実装せず、場合によってはデフォルトのコンストラクターを持たないジェネリック オブジェクトのこの例のクラスのように値がリークしないようにする方法について、適切な答えが見つかりませんでした。

4

4 に答える 4

1

SomeClass私が理解しているように、あなたは、外部のものがオブジェクトを変更できないことを確認したいと考えていますvalue

C++ では const 参照を返すことができますが (完全にコピーすることは避けてください)、Java にはそれがありません。それでは、コピーを見てみましょう...

まず、一部のオブジェクトはコピーできないことを知っておいてください。たとえば、ストリーム、GUI 要素などです。したがって、すべてのオブジェクトをコピーしようとするのは、最初から絶望的な試みです。

しかし、コピー可能なオブジェクトはどうでしょうか?

Java では、ジェネリックのコピー コンストラクター (またはその他のコンストラクター) を呼び出すことはできません (ジェネリック型のコンストラクターを呼び出す)。

インターフェースはありCloneableますが、それは機能するという約束にすぎませんcloneそれは実際には公開されていませclone。したがって、ジェネリックの場合は、ここに示すようにリフレクションを使用する必要があります。

残念ながら、良い解決策はありません。実行可能な唯一の方法 (クラスの目的またはセマンティクスを変更する場合を除く) は、clone上記のリンクに示されているようにメソッドを使用し、一部のオブジェクトをコピーできないことに気付くことです。

最終的には、これを必要としないソリューションを見つけることが最善の方法です。非変更メソッドを公開する (非ジェネリック) 読み取り専用ラッパー クラスを作成します。または、変更メソッドを呼び出してはならないことをドキュメントに規定します。

于 2013-11-09T20:22:31.350 に答える
0

私は3つのアプローチを見ることができます:

  1. コピーを作成します。もちろん、これは型がコピーできる場合にのみ機能します(コピー方法を知っている必要があります)。

  2. 不変型のみをサポートします。

  3. 削除しgetValue()ます。代わりにthis.value、クラスの外部に公開せずに直接操作するメソッドを提供します。このアプローチでsetValue()は、まだ問題が発生する可能性があります ( を呼び出した後、呼び出し元がオブジェクト参照を保持していないことを確認する必要がありますsetValue())。

T制御できない任意の型になる可能性がある場合、オプション 1 と 2 は適切ではありません。

于 2013-11-09T20:19:41.550 に答える
0

私はあなたを理解していないと思います...ジェネリック型を制限したい場合は、ジェネリック型ではジェネリッククラスと等しくない extends キーワードを使用する必要があります。クラスのみを使用する場合、Clonable を実装する方法でこのクラスをインスタンス化できます。一例:

  public class Stack {


    public static void main(String[] args) {
        SomeClass<Animal> sc = new SomeClass<>(); //This generate an error because doesnt implements Clonable interface
        SomeClass<Person> sc1 = new SomeClass<>();
    }

}
class SomeClass<T extends Comparable> //Note that extends means implements or the common extends
{
    private T value;
    public T getValue()
    {
        return value;
    }

    public void setValue(T value)
    {
        this.value = value;
    }
}

class Person implements Comparable<Person>{
    @Override
    public int compareTo(Person p){
        return 0;
    }
}
class Animal {

}

お役に立てば幸いです。:)

于 2013-11-09T20:24:43.253 に答える