用于在场中存储各种类型的模式

时间:2015-04-20 20:07:20

标签: java oop enums type-safety

在属于库的Java类中,我有一个字段size,表示图像的大小。它必须是int,但有些值取决于设备,因此其他开发人员可以为其设置各种类型:

  1. 缩略图(值取决于设备)
  2. 实际大小(值取决于设备)
  3. 自定义(任意整数)
  4. 我想限制其他开发人员(使用此库)使用一组特定且有意义的选项设置size的值。我的目的是向开发人员显示legal options列表也是type safety,例如Enum。但我认为只有enum才能做到这一点,所以我创建了一个接口和一些类:

    public interface SizeMode {
    }
    
    public enum DevicePreDefinedImageSizeMode implements SizeMode {
        THUMBNAIL, REAL_SIZE
    }
    
    public enum CustomImageSizeMode implements SizeMode {
        CUSTOM_SIZE
    }
    
    public abstract class Size {
    
        private final SizeMode mode;
    
        public SizeMode getMode() {
            return mode;
        }
    
        public abstract int getDownSampleFactor();
    
        protected Size(SizeMode mode) {
            this.mode = mode;
        }
    }
    
    public class DevicePreDefinedImageSize extends Size {
    
        public DevicePreDefinedImageSize(DevicePreDefinedImageSizeMode mode) {
            super(mode);
        }
    
        @Override
        public int getDownSampleFactor() {
            throw new UnknownError("????");
        }
    
    }
    
    public class CustomImageSize extends Size {
        private final int downSampleFactor;
    
        private CustomImageSize(CustomImageSizeMode mode, int downSampleFactor) {
            super(mode);
            this.downSampleFactor = downSampleFactor;
        }
    
        @Override
        public int getDownSampleFactor() {
            return downSampleFactor;
        }
    
    }
    

    现在我可以声明类型size类的字段Size,其他开发人员只能使用Size的子类之一,并使用THUMBNAIL初始化它们,{{ 1}}或REAL_SIZE

    但有没有更好的方法来达到我的目的?

2 个答案:

答案 0 :(得分:3)

另一种选择是使用Size实现,只能使用一组静态工厂方法(或者如果需要,可以使用Builder模式)创建:

public class Size {
    private final int sampleFactor;

    private Size(int sampleFactor) {
        this.sampleFactor = sampleFactor;
    }

    public static Size thumbnail() {
        return new Size(THUMBNAIL_FACTOR);
    }

    public static Size real() {
        return new Size(REAL_FACTOR);
    }

    public static Size custom(int factor) {
        return new Size(factor);
    }
}

答案 1 :(得分:2)

在java中,枚举是类,它们可以有成员。

public interface ISize {
  public int getDownSampleSize();
}

enum Size implements ISize {

    THUMBNAIL(THUMBNAIL_SIZE); // Defined elsewhere.

    private int downSampleSize;

    Size(int downSampleSize) {this.downSampleSize = downSampleSize;}
    public int getDownSampleSize() {return downSampleSize;}
}

public class RealSize implements ISize {
  public int getDownSampleSize() {return /* do something complicated */;}
}

public class CustomSize implements ISize {
  private final int downSampleSize;

  public CustomSize(int downSampleSize) {
    this.downSampleSize = downSampleSize;
  }

  public int getDownSampleSize() {return downSampleSize;}
}

然后用法是:

ISize s;
void resize() {
  int downSampleSize = s.getDownSampleSize();
  ...
}

这类似于你所做的但更清洁一点。它使您免于同时使用SizeSizeMode