从接口返回内部类对象

时间:2017-03-11 05:22:26

标签: java class interface inner-classes enumeration

/**
* Created by unibodydesignn on 11.03.2017. 
*/
public interface Enumeration
{
// Returns true if another element in the collection exists
public boolean hasNext();
// Returns the next element in the collection as an Object
public Object getNext(); }


/**
 * NameCollection implements a collection of names using
 * a simple array.

 */
public class NameCollection
{
String[] names;
//this array will be initiliazed at outside

NameCollection(String[] names)
{
    this.names = names;
}
/**
 * getEnumeration should return an instance of a class that
 implements
 * the Enumeration interface where hasNext() and getNext()
 * correspond to data stored within the names array.
 */
Enumeration getEnumeration ()
{

}

public boolean hasNext()
{
  //i will define this method here
}

public Object getNext()
{
 //i will define getNext() here
}

完成方法getEnumeration(),以便它返回一个匿名内部类,该内部类对应于names数组中的名称数组的Enumeration接口 NamesCollection。然后编写一个创建NamesCollection的main方法 带有示例字符串数组的对象,通过此方法检索此类的枚举 getEnumeration(),然后迭代枚举输出每个 使用getNext()方法命名。

我不理解这个问题的概念。我显然不知道该做什么或从哪里开始?我能找到Java的默认hasNext()定义吗? 这不是功课。 它是Absolute Java书籍的编程项目。第13章P3。

2 个答案:

答案 0 :(得分:0)

  

完成方法getEnumeration(),以便它返回一个匿名内部类,该内部类对应Enumeration中名称数组的NamesCollection接口。

练习的目的似乎是与匿名课程一起工作。 例如,不要像这样创建一个名为的类:

class NamesEnumeration implements Enumeration {
    @Override
    public boolean hasNext() {
        // ...
    }

    @Override
    public Object getNext() {
        // ...
    }
}

...说明指导您使用匿名类,如下所示:

    Enumeration getEnumeration() {
        return new Enumeration() {
            @Override
            public boolean hasNext() {
                // ...
            }

            @Override
            public Object getNext() {
                // ...
            }
        };
    }

重要的一点是,匿名实现可以使用其范围内可见的变量。最值得注意的是这个例子, 封闭的names类的NamesCollection字段。

NamesCollection课程中, 您不需要hasNextgetNext方法。 所以课程应该是这样的:

public class NameCollection {
    final String[] names;

    NameCollection(String[] names) {
        this.names = names.clone();
    }

    Enumeration getEnumeration() {
        return new Enumeration() {
            int currentIndex = 0;
            //  ^^^^^^^^^^^^ this is a hint for you

            @Override
            public boolean hasNext() {
                // ...
            }

            @Override
            public Object getNext() {
                // ...
            }
        };
    }
}

我做了一些小改进,并添加了一些提示,以帮助您完成实施。

最后,练习还要求添加main方法来练习此课程。那应该是这样的:

public static void main(String[] args) {
    String[] sample = {"hello", "world"};
    NameCollection namesCollection = new NameCollection(sample);
    Enumeration names = namesCollection.getEnumeration();
    while (names.hasNext()) {
        System.out.println(names.getNext());
    }
}

答案 1 :(得分:0)

我不知道你说的那本书,但让我们了解所要求的内容:

您需要做的是创建Enumeration Interface的实现,我不知道这一章是关于Interfaces还是Enumarations

1: "完成方法getEnumeration(),以便它返回一个匿名内部类,该内部类对应于NamesCollection"中的names数组的Enumeration接口。

在这里你需要返回Enumeration接口的实现,问题是要创建一个Anonymous类(但我最喜欢创建一个内部类,也许是私有内部类)。像这样,在NameCollection类中:

public Enumeration getEnumeration(){
  Enumeration enumerat = new Enumeration(){
    private int index = 0;

    public boolean hasNext(){
      return names.length > index;
    }
    public Object getNext(){
      return names[index++];
    }
  };
  return enumerat;
}

该方法返回Enumeration类的实现,您可以使用该实现遍历传递给NameCollection类的构造函数的名称数组。

2: "然后编写一个main方法,创建一个带有示例字符串数组的NamesCollection对象,通过getEnumeration()检索此类的Enumeration,然后迭代通过枚举使用getNext()方法输出每个名称"

在这里,您只需要为您的实现创建一个测试类:

public class Main {

  public static void main(String[] args) {

    NameCollection nc = new NameCollection(new String[]{ "Adriane", "Beatriz" });
    Enumeration en = nc.getEnumeration();
    while( en.hasNext() ){
      System.out.printf("Name: %s \n", en.getNext() );
    }

  }

}