2017-08-13 8 views
3

私はLinkedHashSetに拡張された単純なクラスを持ち、toString()メソッドをオーバーライドしようとしています。メインメソッドのSetにいくつかの要素を追加しましたが、私のtoStringメソッドの中では、Setは空です。コード:なぜ私のLinkedHashSetはtoString()メソッド内で空ですか?

import java.util.*; 
import java.util.*; 

public class MyHashSet<T> extends LinkedHashSet<T>{ 
    private Set <T> myHashSet; 


    public MyHashSet(){ 
     myHashSet = new HashSet<T>(5); 
    } 

    @Override 
    public String toString(){ 
     if (myHashSet.isEmpty()) 
      return "This MyHashSet is empty."; 
     else 
      return myHashSet.toString(); 
    } 

    public static void main (String[] args){ 
     MyHashSet <String> myHashSet = new MyHashSet<>(); 

     myHashSet.add("A"); 
     myHashSet.add("B"); 
     myHashSet.add("C"); 
     myHashSet.add("D"); 
     myHashSet.add("E"); 

     System.out.println(myHashSet); 

     System.out.println(myHashSet.isEmpty()); 
    } 
} 

は、次の値を返します。

このMyHashSetは空です。
偽私が代わりに返すようにtoString()を期待してい

[A、B、C、D、E]私が間違っているのは何

?前もって感謝します。

+0

ヒント:あなたのコードには、myHashSetという** 2つの**ものがあります。 –

+1

デバッガで5分間、この質問(およびその結果としてのdownvote)は必要ではありませんでした。 –

+0

myHashSet.myHashSet.add( "A"); :この形式でデータを追加します。 – Akash

答えて

5

toString()メソッドは、宣言しているmyHashSetフィールドに依存しますが、要素を追加しません。

確かに、ここに:

 MyHashSet <String> myHashSet = new MyHashSet<>(); 

    myHashSet.add("A"); 
    myHashSet.add("B"); 
    myHashSet.add("C"); 
    myHashSet.add("D"); 
    myHashSet.add("E"); 

あなたは、あなたのクラスの継承元LinkedHashSet実装に依存することにより、要素を追加します。もちろん、あなたのフィールドは使用しません。

LinkedHashSetを拡張する場合、実際にはmyHashSetと宣言する必要はありません。
soからあなたが継承したクラスに依存するだけで変更toString()方法:

@Override 
public String toString(){ 
    if (isEmpty()) 
     return "This MyHashSet is empty."; 
    else 
     return super.toString(); 
} 

そうでなければ、あなたもmyHashSetフィールドに依存することによって組成物を用いることができますが、あなたはLinkedHashSetを拡張するのではなくSet<E>を実装するべきではありません。

とにかく、継承または合成を使用してください。
しかし、同時に両方ではありません。

3

シンプル:あなたはではないため、には、あなたのクラスにフィールドとして持っている内部マップに要素を追加しません。

ここでこの:

myHashSet.add("A"); 

は、あなたのクラスを継承し、 "設定" 構造に要素を追加します。

内部をに設定するには、さまざまな方法を@Overrideする必要があります。add()

しかし、注意してください:あなたは使用組成物のいずれか(内部myHashSetフィールドことを使用して)必要があります - 継承が(そして、あなたが最初の場所で、このようなフィールドを必要としません)。

2つののコンセプトは、このように組み合わせるべきではありません。

それ以外にも、myHashSetという2つのものがあります。これはむしろ混乱します。このような方法で名前を再使用することは避けてください!

関連する問題