Java 标记接口与枚举

Java 标记接口与枚举,java,oop,enums,interface,Java,Oop,Enums,Interface,我正在做一个动物园的模型 假设我对动物园的区域有以下结构(省略了一些细节) 然后我有下面的动物结构 public abstract class Animal{} public class Lion extends Animal{} public class Zebra extends Animal{} public class Shark extends Animal{} public class Starfish extends Animal{} public class Parrot ext

我正在做一个动物园的模型

假设我对动物园的区域有以下结构(省略了一些细节)

然后我有下面的动物结构

public abstract class Animal{}
public class Lion extends Animal{}
public class Zebra extends Animal{}
public class Shark extends Animal{}
public class Starfish extends Animal{}
public class Parrot extends Animal{}
public class Eagle extends Animal{}
我想把动物添加到相应的适当栖息地。为了简化代码,我考虑使用标记接口,例如

public interface TerrestrialAnimal{}
public class Lion extends Animal implements TerrestrialAnimal{}
public class Zebra extends Animal implements TerrestrialAnimal{}
然后我就能做到

public class Zoo{

   public boolean addAnimal(AnimalHabitat habitat, Animal animal) {
      if (animal instanceOf TerrestrialAnimal && habitat instanceOf Enclosure) {
         habitat.set(animal);
         return true;
      }
      if (animal instanceOf AquaticAnimal && habitat instance of Aquarium) {
          habitat.set(animal);
          return true;
      }
      // So for aerial
   }
}
但是另一种方法是使用枚举。例如,假设我有

public enum AnimalType{
   Terrestrial, Aquatic, Aerial;
   
   //getter
}
然后在动物抽象类中我可以定义

public abstract class Animal{
   private AnimalType type;
   // Initialise in the constructor depending on the animal instance
}
我将在Zoo中的addAnimal()方法中执行同样的操作


每种方法的优缺点是什么?谢谢

我会使用枚举。您不需要所有这些if语句

只需在
Animal
animalhabitation
中都设置属性
type
,然后比较它们

if (animal.getType() == habital.getType()) { // can add to habitat

如果要向特定于动物类型的接口添加某些方法,请切换到接口。

我将使用枚举。您不需要所有这些if语句

只需在
Animal
animalhabitation
中都设置属性
type
,然后比较它们

if (animal.getType() == habital.getType()) { // can add to habitat
如果要向特定于动物类型的界面添加某些方法,请切换到界面。

Enum 专业人士

  • 易于扩展:您可以轻松增加价值
  • 更精确:您有一个文件来定义所有AnimalType
  • 更具可读性:绝对可读
  • 更灵活:您可以在枚举上定义方法,并且可以使用枚举值打印AnimalType
  • Compariable:您可以执行简单的比较,而不是使用instanceof
使用枚举方法,我没有发现任何缺点

接口 专业人士

  • 方法:您可以定义通用方法签名
  • 您可以在同一动物中使用2个接口(一种动物可能有更多的栖息地?或者更多的类型?)
  • 可以将接口用作集合/类变量中的超类型
缺点

  • 昂贵:绝对昂贵,每种类型一个接口
在您的示例中,我更喜欢枚举,因为您使用接口来定义动物类型,并且可以使用枚举轻松完成。如果需要定义公共方法签名或希望使用接口作为超类型,请使用接口,如下所示:

List terrestrialAnimal=new ArrayList()它可以包含所有陆地动物。

Enum 专业人士

  • 易于扩展:您可以轻松增加价值
  • 更精确:您有一个文件来定义所有AnimalType
  • 更具可读性:绝对可读
  • 更灵活:您可以在枚举上定义方法,并且可以使用枚举值打印AnimalType
  • Compariable:您可以执行简单的比较,而不是使用instanceof
使用枚举方法,我没有发现任何缺点

接口 专业人士

  • 方法:您可以定义通用方法签名
  • 您可以在同一动物中使用2个接口(一种动物可能有更多的栖息地?或者更多的类型?)
  • 可以将接口用作集合/类变量中的超类型
缺点

  • 昂贵:绝对昂贵,每种类型一个接口
在您的示例中,我更喜欢枚举,因为您使用接口来定义动物类型,并且可以使用枚举轻松完成。如果需要定义公共方法签名或希望使用接口作为超类型,请使用接口,如下所示:


List terrestrialAnimal=new ArrayList()它可以包含所有陆地动物。

在物品数量有限的地方使用枚举。动物和栖息地(实际上)有无限多的事物,因此不能很好地用枚举建模。在事物数量有限的地方使用枚举。动物和栖息地(实际上)有无限多的东西,所以没有用枚举很好地建模。该死,这太干净了!这实际上是一项作业,所以我无法在截止日期(昨天)之前发布问题:)谢谢你的回答!该死,太干净了!这实际上是一项作业,所以我无法在截止日期(昨天)之前发布问题:)谢谢你的回答!
if (animal.getType() == habital.getType()) { // can add to habitat