对于我来说Java enums是不可能的。
为了贴近您发布的片段,您将会变得冗长,正如您已经假设的那样。
枚举
enum BarcodeType {
UPCA,
QRCode,
UNDEFINED;
}
工厂类
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);
}
}
具体实施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;
}
}
具体实施QR码
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;
}
}
演示应用
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());
}
}
}
输出
UPC-A: 8, 85909, 51226, 3
QR code: foobar
我觉得'Pair'可能就是你要找的东西。为了给一个带有语义含义的名字,可能会提供一个'BarCodeEntry ',它提供一个'BarCode getBarCode()'和'T getData()'? –
@chrylis你链接到的东西不是一回事。看看switch语句。注意let表达式的集合。在Java中,我不知道如何动态地让每个值具有不同的一组关联值,每个关联值具有不同的一组类型。你链接的文件根本就没有解释。 – startoftext
@chrylis没有读到这个问题。我有同样的问题,发现这个问答很有用。 – rmp251