界面名称可以是返回类型吗?

时间:2016-05-07 12:18:02

标签: java

public interface Shape {
       void draw();
    }



class Square implements Shape {

   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}


class ShapeFactory {

   //use getShape method to get object of type shape 
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }     




       else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }

      return null;
   }
}

public class FactoryPatternDemo {

   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();

      //get an object of Square and call its draw method.
      Shape shape1 = shapeFactory.getShape("Square");

      //call draw method of square
      shape1.draw();


   }
}

我在学习设计模式时获得了此代码,在此代码中,getShape方法的返回类型为Shape(接口)

那么接口类型是否可以设置为另一种方法的返回类型?

4 个答案:

答案 0 :(得分:2)

  

那么,接口类型是否可以设置为另一种方法的返回类型?

是的,在Java中,可以始终将任何方法的返回值声明为接口类型。引用specification(强调我的):

  

接口声明引入了一个新的引用类型,其成员是类,接口,常量和方法。此类型没有实例变量,通常声明一个或多个抽象方法; 其他不相关的类可以通过提供其抽象方法的实现来实现接口。接口可能无法直接实例化。

在Java中,有两种类型的

  1. 原始类型(仅限byte, short, int, long, float, double, and boolean
  2. 参考类型(可以任意多次)
  3. 因此,当您有一个接口Shape时,您可以声明其返回类型( Reference 类型)为Shape的方法。由于Shape是一个接口,因此您无法直接实例化它,因为它是abstract(如果执行Shape abstractShape = new Shape();,您将收到编译器错误:Shape is abstract; cannot be instantiated)。在这方面,返回类型声明类似于变量类型声明。

    这里没有特定的工厂设计模式,尽管它在实施工厂时特别重要。通常,只要您认为编码到接口是特定功能的良好实践,将返回类型声明为接口就可以实现这种做法。

答案 1 :(得分:2)

这实际上是一个很好的做法,因为您正在为接口而不是Classes进行编程,这隐藏了实现的细节并使您的代码更容易维护。想象一下:你有一个接口X,两个实现它的类(A和B)和另一个有一个叫做foo()的方法的类(C)。由于类A和B都实现了X,因此foo()的返回可以是X,它允许您返回A或B对象。 在Java中,当你有一个实现接口的类时,该类的实例也是该接口的一个实例,这就是你可以使用接口作为返回类型的原因。

为了测试我所说的内容,您可以创建一个名为MyInterface的接口和一个实现MyInterface的Class TestClass。如果你创建一个TestClass实例(比如说“myClass”),如果编译并运行这段代码,你可以检查一下:

  if (myClass instanceof MyInterface) {
         System.out.println("Hey, I'm an instance of MyInterface!");
  }

答案 2 :(得分:1)

这是工厂方法模式的基础: 工厂方法通常返回接口类型, 并且将返回的特定类是隐藏的实现细节。

典型的例子是java.util.Collections中的各种工厂方法,例如emptyListsingletonList,等等。 这些方法返回List类型,实现完全隐藏。

另一个很好的例子是java.util.EnumSet中的工厂方法, 返回类型EnumSet,这是一个abstract类。 根据底层枚举类型的大小,如果底层枚举类型包含64个或更少的元素(如大多数枚举类型那样),则方法将返回RegularEnumSet实例,或者JumboEnumSet实例。 这是EnumSet的两种不同实现。确切的类型与客户无关,可以隐藏实现细节。

答案 3 :(得分:0)

这是一种抽象方式,“隐藏实际实施”。