如何使用Swift枚举等关联值创建Java枚举?

sta*_*ext 10 java enums swift

编辑:要明确我不会问如何在java中使用枚举.我问的是,java中是否存在与枚举中的Swifts关联值互补的内容.这不仅仅是如何在枚举上存储值.看看我提供的示例,您将看到不同之处.

因此,iOS开发人员向我展示了一个架构,他使用了swifts枚举关联值.这个概念对我来说似乎很有趣我作为一个Android开发人员,我很好奇,看看它是否可能在java中而不是过于冗长.Java枚举的等价物是什么?还是不可能?

以下是关联值的一个例子.它从苹果文档中拉出来 .

enum Barcode {
    case UPCA(Int, Int, Int, Int)
    case QRCode(String)
}

// Instantiated
var productBarcode = Barcode.UPCA(8, 85909, 51226, 3)
// or
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")


switch productBarcode {
case .UPCA(let numberSystem, let manufacturer, let product, let check):
    println("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
case .QRCode(let productCode):
    println("QR code: \(productCode).")
}
Run Code Online (Sandbox Code Playgroud)

Sub*_*mal 13

对于使用Java枚举的我来说,这是不可能的.

如您已经假设的那样,要接近您发布的代码片段,您将会很详细.

枚举

enum BarcodeType {
    UPCA,
    QRCode,
    UNDEFINED;
}
Run Code Online (Sandbox Code Playgroud)

工厂类

abstract class Barcode {

    abstract public BarcodeType getType();

    public static final Barcode newUPCA(int numberSystem, int manufacturer, int product, int check) {
        return new BarcodeUPCA(numberSystem, manufacturer, product, check);
    }

    public static final Barcode newQRCode(String productCode) {
        return new BarcodeQRCode(productCode);
    }
}
Run Code Online (Sandbox Code Playgroud)

具体实施UPCA

class BarcodeUPCA extends Barcode {
    private final int numberSystem;
    private final int manufacturer;
    private final int product;
    private final int check;

    public BarcodeUPCA(int numberSystem, int manufacturer, int product, int check) {
        this.numberSystem = numberSystem;
        this.manufacturer = manufacturer;
        this.product = product;
        this.check = check;
    }

    public int getNumberSystem() {
        return numberSystem;
    }

    public int getManufacturer() {
        return manufacturer;
    }

    public int getProduct() {
        return product;
    }

    public int getCheck() {
        return check;
    }

    @Override
    public BarcodeType getType() {
        return BarcodeType.UPCA;
    }
}
Run Code Online (Sandbox Code Playgroud)

具体实现QRCode

class BarcodeQRCode extends Barcode {

    private final String productCode;

    public BarcodeQRCode(String productCode) {
        this.productCode = productCode;
    }

    public String getProductCode() {
        return productCode;
    }

    @Override
    public BarcodeType getType() {
        return BarcodeType.QRCode;
    }
}
Run Code Online (Sandbox Code Playgroud)

演示应用程序

public class BarcodeMain {

    public static void main(String[] args) throws Exception {
        List<Barcode> barcodes = new ArrayList<>();
        barcodes.add(Barcode.newUPCA(8, 85909, 51226, 3));
        barcodes.add(Barcode.newQRCode("foobar"));

        for (Barcode barcode : barcodes) {
            switch (barcode.getType()) {
                case UPCA: {
                    BarcodeUPCA b = (BarcodeUPCA) barcode;
                    System.out.printf("UPC-A: %d, %d, %d, %d%n",
                            b.getNumberSystem(),
                            b.getManufacturer(),
                            b.getProduct(),
                            b.getCheck()
                    );
                    break;
                }
                case QRCode: {
                    BarcodeQRCode b = (BarcodeQRCode) barcode;
                    System.out.printf("QR code: %s%n", b.getProductCode());
                    break;
                }
                default:
                    System.err.println("unhandled type: " + barcode.getType());
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

产量

UPC-A: 8, 85909, 51226, 3
QR code: foobar
Run Code Online (Sandbox Code Playgroud)