2016-11-17 14 views
1

JavaでGraph<E>というインターフェイスを実装する必要があります。内部クラスを使用してJava /内部メソッドの外部クラスのプライベートレコードを作成する可視性

たとえば、MyGraph<E extends Comparable<E>>はGraphを実装するためのクラスです。

タイプEの要素を「カプセル化」するために、内部クラスNodeを作成します。

public class MyGraph<E extends Comparable<E>> implements Graph<E>{ 


    MyGraph methods and instance variables... 
    . 
    . 
    . 



    class Node { 
     E elem; 
     List<E> edges; 
     ... 
     public Node(E e){ 
      this.elem = e; 
      edges = null; 
     } 
    } 
} 

問題は、それのインスタンス変数がpublicまたはprivate宣言する必要がある場合は内部クラスはNodeまたはNode<E>publicまたはprivateであるべきであれば、私は理解できないです。そして、私はNodeに挿入する予定のいくつかのメソッドについても同様です。

基本的クラスノードは、(typedefと)Cレコード・タイプのようでなければならず、外部クラスは、オブザーバーなしゲッターをノードのすべてのインスタンス変数にアクセスすることができなければならない、など

+4

'Node'は' MyGraph'定義の一部であり、外部クラスによってアクセス可能で変更可能であってはならないため、 'private'クラスである必要があります。あなたはあなたのグラフの一部である、あなたのノードでいくつかの計算を行っています。すでにパラメータ化されたクラス(つまり、MyGraph )のようにパラメータ化する必要はありません。 JavaのPrinceton on Algorithmsの優れたリソースをご覧くださいhttp://algs4.cs.princeton.edu/home/ – Stefan

+1

Nodeクラスのメンバーにアクセスする必要がないため、Nodeクラス 'private static'を宣言する必要があります外側の階級。これをしないと、すべてのインスタンスはインスタンス化するインスタンスへの参照を持ちます。これを行うにはパラメータを与える必要があります。 _E_をパラメータ名として使用すると、外部クラスの_E_がシャドウされるので、明確にするために別の名前を付けることを検討してください。あなたの外部クラスは 'Node'のメンバーに完全なアクセス権を持ち、' ​​Node'がプライベートであれば他のクラスはアクセスできませんので、メンバーのアクセスレベルを気にする必要はありません。 – teppic

+0

@teppic "これをしなければ、すべてのインスタンスはインスタンス化するインスタンスへの参照を持ちます"という意味はどういう意味ですか? –

答えて

2

外部クラスのメンバーにアクセスする必要がないため、Nodeクラスをprivate staticとして宣言する必要があります。これをしないと、すべてのインスタンスがインスタンス化インスタンスへの参照を持ちます。これを行うにはパラメータを与える必要があります。

Eをパラメータ名として使用すると、外部クラスのEがシャドウされるため、わかりやすくするために別の名前を付けることを検討してください。外部クラスはNodeのメンバーにフルアクセスできます.Nodeがプライベートである場合、他のクラスはアクセスできませんので、メンバーのアクセスレベルを気にする必要はありません。

関連する問題