0

C# のバックグラウンドから、つい最近 Java を学び始めました。

コレクションを使い始めたとき、Arrays.asList()がオブジェクトを返すことに気付きましたArrayList<T>

しかし、私が理解していないのは、「docjar」(行 2834)に記載されているコードによると、プライベートArrayList<T>としてラベル付けされていることです。

非表示として明示的にマークされたオブジェクトを使用するにはどうすればよいですか? または(これは私が推測していることです)、プライベートには、私が想定しているものとは異なる意味がありますか?

(また、そのクラスは静的としてマークされていることに注意してください。これも混乱しますが、別の質問で尋ねます)


編集: コンパイラ エラーをスローする C# の例:

public class PubClass {
        private class Blah {

        }

        public Blah GetBlah() {
            return new Blah();
        }
}

提供:一貫性のないアクセシビリティ: 戻り値の型 'Namespace.PubClass.Blah' は、メソッド 'Namespace.PubClass.GetBlah()' よりもアクセスしにくい

4

3 に答える 3

6

返される は、そのインターフェイスに含まれるすべてのメソッドArrayListを実装します。Listは公開されているためList、これらのメソッドについて知っていて、それらを呼び出すことができます。

プライベートである理由は、パブリックである理由がないためです。インターフェイスが提供するArrayListもの以外の追加機能は提供しません。List

/edit
あなたの例は、ここで起こっていることを模倣していません:

public interface List<T> {
    /** snip */
}

public class Arrays {
    private static class ArrayList<T> implements List<T> {
        /** snip */
    }

    public <T> List<T> asList(T... arr) {
        return new ArrayList<>(arr);
    }
}

あなたの例では、外部の呼び出し元が知らないプライベート クラスのインスタンスを返そうとしています。このArrays例では、返されるオブジェクトは実際にはList(戻り値の型を見てください) であり、 private ではありませんArrayList

于 2012-06-10T23:21:04.323 に答える
1

プライベートとは、プライベートとしてマークされたクラス/フィールド/メソッドが、現在のスコープ (定義されているクラス) でのみアクセスできることを意味します。これは、Arrays クラスで指定されているように、外部から新しい ArrayList をインスタンス化できないことを意味します。asList(T... a)ただし、クラス内のメンバーは、メソッドと同様にクラスを利用できます。

戻り値の型は、実際にはList<T>のスーパークラスでありArrayList<T>、プログラムで認識されているメソッドを使用してパブリック クラスであるため、それを利用できます。

クラスは動的である必要がないため、静的としてマークされます。クラスの定義は、 の新しいインスタンスごとに変更されませんArrays

于 2012-06-10T23:23:09.013 に答える
0

プライベートは、インターフェイスを介してクラスの外部にアクセスできないことを意味します。たとえば、次のようなことはできませんmyObject.m_privateVariableasList「ゲッター」がプライベート変数への参照を返しているため、制御された方法で公開しているだけです。

アクセサー (ミューテーター メソッドを参照) を使用すると、クラスはそのデータへのアクセスを制御できます。たとえば、プライベート変数を返す前になんらかの操作を行う必要がありますが、すべてのメンバー変数に直接アクセスできるようにすると、1 回の呼び出しでは実行できません。

于 2012-06-10T23:24:44.567 に答える