java - 在字段中存储各种类型的模式

标签 java oop enums type-safety

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

  1. 缩略图(值取决于设备)
  2. 实际大小(值取决于设备)
  3. 自定义(任意整数)

我想限制其他开发人员(使用此库)使用一组特定且有意义的选项中的一个选项来设置 size 的值。我的目的是显示 合法选项列表 给开发人员以及类型安全,例如Enum。但我认为仅通过 enum 是不可能做到这一点的,所以我创建了一个接口(interface)和一些类:

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 的子类之一并初始化它们使用 THUMBNAILREAL_SIZECUSTOM_SIZE

但是是否有更好的方法来实现我的目的?

最佳答案

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

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);
    }
}

关于java - 在字段中存储各种类型的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29757383/

相关文章:

ruby - 使子类无法访问实例方法

ios - 现在如何在 RealmSwift 4.0 更新中使用枚举?

Swift:结构看起来像枚举大小写,后跟 (.)

java - OneToMany 单向关系后从数据库检索数据

java - 使用 gradle.buildRpm 在 RPM 中创建空目录

java - 新标签页无法使用 selenium 在 Firefox 中打开新网址

java - 最终变量首先初始化

c# - Asp.net - 向类添加函数

c++ - 从另一个类中访问对象的类方法,C++

c# - 如何在 C# 中处理枚举 0(CA1008 讨论)