在属于库的Java类中,我有一个字段size
,表示图像的大小。它必须是int
,但有些值取决于设备,因此其他开发人员可以为其设置各种类型:
我想限制其他开发人员(使用此库)使用一组特定且有意义的选项设置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
。
但有没有更好的方法来达到我的目的?
答案 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();
...
}
这类似于你所做的但更清洁一点。它使您免于同时使用Size
和SizeMode
。