如何在运行时根据Java中父类的实例变量选择基类?

问题: 对于以下类,我试图在运行时根据Java中父类的实例变量选择一个基类。我相信在OOPS中应该有一些基本的属性可以帮助我实现这个目标,而我只是缺少这些属性。

    class Transaction{
       int id;
       enum transactionType;
    }

    class ATypeTransaction extends Transaction{
       /* bunch of instance variable specific to ATypeTransaction */
    }

    class BTypeTransaction extends Transaction{
       /* bunch of instance variable specific to BTypeTransaction */
    }
 /* The event can be triggered with any transactionType as declared in the enum TransactionType as each event would be associated with one transaction.*/
        class Event{
           int eventId;
           enum transactionType;
        }

基于transactionType,我必须准备Transaction Payload,不同的基类的属性会有所不同,如下所示。

我的方法: 我正试图使用类似这样的东西(switch-case中的静态多态),试图根据transactionType来解决事务实例的问题。相反,我得到的是父类,它阻止我访问子类的属性。

public Transaction selectTransaction(TransactionType transactionType){
        Transaction transaction;
        switch(transactionType) {
            case = "AType":
                transaction= new ATypeTransaction();
                break;
            case = "BType":
                transaction= new BTypeTransaction();
                break;
        }
   return transaction;
}

请帮我解决这个问题,提供一个好的设计来解决这个问题。先谢谢你了。

解决方案:

如果你设定使用switch和enum类型选择返回对象的类型,我认为这将是最好的解决方案。

public static enum TransactionType {
    AType,
    BType
}

public static class Transaction {
    public static void main(String[] args) {
        ATypeTransaction transA = selectTransaction(TransactionType.AType);
        BTypeTransaction transB = selectTransaction(TransactionType.BType);
        Transaction trans = selectTransaction(TransactionType.AType);

        transA.doA();
        transB.doB();
        ((ATypeTransaction)trans).doA();

        //The following will cause class cast exception
        ATypeTransaction transC = selectTransaction(TransactionType.BType);
        ((BTypeTransaction)trans).doB();
    }

    @SuppressWarnings("Unchecked")
    public static <T extends Transaction> T selectTransaction(TransactionType transactionType){
        switch(transactionType) {
            case AType:
                return (T) new ATypeTransaction();
                break;
            case BType:
                return (T) new BTypeTransaction();
                break;
        }
    }
}

public static class ATypeTransaction extends Transaction {
    public void doA() {}
}
public static class BTypeTransaction extends Transaction {
    public void doB() {}
}

不幸的是,除非你知道如果你的结果是 selectTransaction 方法将是类Transaction的一个特定的超类(所以你可以把它保存到一个正确类型的变量中),或者如果你使用操作符检查类型 instanceof 的情况下 Transaction),你会冒着JVM抛出 ClassCastException.

给TA打赏
共{{data.count}}人
人已打赏
未分类

通过指定组ID将一个列表分成若干组。

2022-10-11 6:47:23

未分类

sheetJs - 空单元格无输出

2022-10-11 6:58:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索