2013-05-25 3 views
1

Как ограничить использование только одного THUMNAIL? Это означает, что если разработчик использует THUMNAIL_MID и THUMBNAIL, он должен выбросить ошибку компиляции, чтобы разработчик знал, что может использоваться только одна константа THUMNAIL.Как ограничить Enum определенного типа?

Не разрешено

ImageSize[] imageArray = {ImageSize.A4,ImageSize.THUMBNAIL_MID,ImageSize.THUMBNAIL} ; 

Разрешено

ImageSize[] imageArray = {ImageSize.A4,ImageSize.THUMBNAIL_MID} ; 

ENUM Код

public enum ImageSize 
    { 
     THUMBNAIL(50, 50, "t"), PASSPORT(200, 200, "p"), SMALL(240, 135, "s"), MEDIUM(
       480, 270, "m"), LARGE(960, 540, "l"), A4(800, 600, "a4"),THUMBNAIL_MID(120,155,"t"); 
     /** 
     * The width of the image in pixels 
     */ 
     private final int width; 
     /** 
     * The height of the image in pixels 
     */ 
     private final int height; 
     /** 
     * The image size type 
     */ 
     private final String type; 

     ImageSize(int width, int height, String type) 
     { 
      this.width = width; 
      this.height = height; 
      this.type = type; 
     } 

     public int getWidth() 
     { 
      return width; 
     } 

     public int getHeight() 
     { 
      return height; 
     } 

     public String getType() 
     { 
      return type; 
     } 

     public static ImageSize getImageSizeByType(String type) 
     { 
      if (type != null) 
      { 
       if (type.equalsIgnoreCase(THUMBNAIL.getType())) 
       { 
        return THUMBNAIL; 
       } 
       if (type.equalsIgnoreCase(PASSPORT.getType())) 
       { 
        return PASSPORT; 
       } 
       if (type.equalsIgnoreCase(SMALL.getType())) 
       { 
        return SMALL; 
       } 
       if (type.equalsIgnoreCase(MEDIUM.getType())) 
       { 
        return MEDIUM; 
       } 
       if (type.equalsIgnoreCase(LARGE.getType())) 
       { 
        return LARGE; 
       } 
       if (type.equalsIgnoreCase(THUMBNAIL_MID.getType())) 
       { 
        return THUMBNAIL_MID; 
       } 
      } 
      return null; 
     } 
    } 

} 
+2

Я уверен, что вы не можете. Но вы можете инкапсулировать свой код в метод, который возвращает массив 'ImageSize' с' THUMNAIL_MID' или 'THUMBNAIL' и управляет кодом как таковым. – rath

ответ

0

Я бы рекомендовал создать пе w enum. Новое перечисление может содержать одно поле - ссылку на старое перечисление. Вы создаете значения в новом перечислении, соответствующем значениям старого перечисления, которое вы хотите разрешить.

Затем в вашем коде вы используете новый тип перечисления (при необходимости). Я предполагаю, что всегда было целесообразно использовать новый тип перечисления, который вы могли бы просто удалить дополнительные типы перечислений.

Я использовал имя AllowableImageSize, потому что я не знаком с контекстом. Вероятно, вы должны выбрать лучшее имя (например, ThumbnailImageSize, PassportImageSize, LinkImageSize и т. Д.).

Вы не ограничены созданием одного нового перечисления. В зависимости от ваших потребностей вы можете иметь ThumbnailImageSize и PassportImageSize, которые указывают на разные подмножества ImageSize.

Я создал образец кода на ideone.

class Main 
{ 
     public static void main (String [ ] args) 
     { 
     } 
} 


enum AllowableImageSize 
{ 
     THUMBNAIL_MID(ImageSize.THUMBNAIL_MID), THUMBNAIL(ImageSize.THUMBNAIL); 

     public final ImageSize imageSize; 

     AllowableImageSize(ImageSize imageSize) 
     { 
       this.imageSize=imageSize; 
     } 
} 

    enum ImageSize 
    { 
     THUMBNAIL(50, 50, "t"), PASSPORT(200, 200, "p"), SMALL(240, 135, "s"), MEDIUM(
       480, 270, "m"), LARGE(960, 540, "l"), A4(800, 600, "a4"),THUMBNAIL_MID(120,155,"t"); 
     /** 
     * The width of the image in pixels 
     */ 
     private final int width; 
     /** 
     * The height of the image in pixels 
     */ 
     private final int height; 
     /** 
     * The image size type 
     */ 
     private final String type; 

     ImageSize(int width, int height, String type) 
     { 
      this.width = width; 
      this.height = height; 
      this.type = type; 
     } 

     public int getWidth() 
     { 
      return width; 
     } 

     public int getHeight() 
     { 
      return height; 
     } 

     public String getType() 
     { 
      return type; 
     } 

     public static ImageSize getImageSizeByType(String type) 
     { 
      if (type != null) 
      { 
       if (type.equalsIgnoreCase(THUMBNAIL.getType())) 
       { 
        return THUMBNAIL; 
       } 
       if (type.equalsIgnoreCase(PASSPORT.getType())) 
       { 
        return PASSPORT; 
       } 
       if (type.equalsIgnoreCase(SMALL.getType())) 
       { 
        return SMALL; 
       } 
       if (type.equalsIgnoreCase(MEDIUM.getType())) 
       { 
        return MEDIUM; 
       } 
       if (type.equalsIgnoreCase(LARGE.getType())) 
       { 
        return LARGE; 
       } 
       if (type.equalsIgnoreCase(THUMBNAIL_MID.getType())) 
       { 
        return THUMBNAIL_MID; 
       } 
      } 
      return null; 
     } 
    } 
+0

Итак, теперь, если я пишу ImageSize [] imageArray = {ImageSize.A4, ImageSize.THUMBNAIL_MID, ImageSize.THUMBNAIL}; что это произойдет? – user1595858

+0

Это разрешено, но вы должны делать AllowableImageSize [] imageArray = {AllowableImageSize.A4, AllowableImageSize.THUMBNAIL_MID, AllowableImageSize.THUMBNAIL}, который компилятор отклонит – emory

Смежные вопросы