填充不同大小的数组

时间:2011-06-27 15:23:05

标签: java arrays attributes

好吧我很确定这不是一个干净的实现。

我有一个包含属性的数组,我必须根据传入对象的属性进行填充。

我是以一种相当肮脏的方式做到这一点,然后又回来咬我的屁股!

我们生病了:

我有AccountsGRP[]。我在这两种方法之间填充:

    public static AccountGrp[] popAccArr(IncomingObject incObject) {
    ArrayList<AccountGrp> accAL = new ArrayList<AccountGrp>();
    for (int i = 0; i < NoAccounts; i++) {
        accAL.add(popAccAttr(i, incObject));
    }
    AccountGrp[] AccountGrpArr = (AccountGrp[]) accAL
            .toArray(new AccountGrp[accAL.size()]);
    return AccountGrpArr;
}

private static AccountGrp popAccAttr(int i, IncomingObject incObject) {
    AccountGrp acc = new AccountGrpImpl();
    switch (i) {
    case 0:
        acc.setAccount(incObject.getM_clientAcronym());
        acc.setAccountType(AccountType.CUST);
        acc.setAcctIDSource(AcctIDSource.SLANG);
        acc.setGrandParentAccount(incObject.getM_grandparentNum());
        return acc;
    case 1:
        acc.setAccount(incObject.getM_brokerAcronym());
        acc.setAccountType(AccountType.BKR);
        acc.setAcctIDSource(AcctIDSource.SLANG);
        // acc.setGrandParentAccount(incObject.getM_grandparentNum());
        return acc;
    case 2:
        acc.setAccount(incObject.getM_errorAccount());
        acc.setAccountType(AccountType.FIRM);
        acc.setAcctIDSource(AcctIDSource.SLANG);
        acc.setAccountSubType(AccountSubType.ERROR);
        return acc;
    default:
        acc.setAccount(incObject.getM_clientAcronym());
        acc.setAccountType(AccountType.CUST);
        acc.setAcctIDSource(AcctIDSource.SLANG);
        acc.setGrandParentAccount(incObject.getM_grandparentNum());
        return acc;
    }
}

这是错误的编码我需要填充一些不同类型的帐户,所以这个案例陈述是不灵活和肮脏的。我正在考虑是否有这样的实施。只需编写一个带有许多参数的方法来获取相关值,但问题出现在以下方面:

acc.setAccountType(AccountType.BKR);
        acc.setAcctIDSource(AcctIDSource.SLANG);

哪些是返回枚举。也不是每个帐户迭代都填充所有属性有没有办法获得可选参数或者只是一个重载的情况?

4 个答案:

答案 0 :(得分:1)

我没有时间或精神上的毅力准确地再现您的确切条件,但这里有一段类似的代码片段可以帮助您入门:

public static AccountGrp[] popAccArr(IncomingObject incObject) {
    AccountGrp[] ret = new AccountGrp[NoAccounts];

    if(ret.length > 0) {
        ret[0] = //first one
    }

    if(ret.length > 1) {
        ret[1] = //second one
    }

    if(ret.length > 2) {
        ret[2] = //third one
    }

    for(int i = 3; i < ret.length; i++) {
        ret[i] = //nth one
    }

    return ret;
}

答案 1 :(得分:0)

这不是关于数组,而是关于如何将整数(i = [0-2])映射到包括枚举值的各种参数的集合,每个参数可能具有不同类型的参数(子类型,祖父级引用)。 / p>

重载popAccAttr无济于事,因为调用者必须选择正确的重载。这只会将问题转移给调用者。你仍然需要映射i =&gt; params。

在我看来,清理它的最佳方法是删除不透明的整数i。 “2”在这种方法之外意味着什么?您可以使用枚举,该枚举既提供所有可能帐户类型的列表,也提供每个帐户类型的映射。看起来帐户类型本身就足够了。所以,(也删除了“0”和“默认”情况之间的冗余),

public static AccountGrp[] popAccArr(IncomingObject incObject) {
    ArrayList<AccountGrp> accAL = new ArrayList<AccountGrp>();
    for (AccountType type : AccountType.values()) { // enumerate values
        accAL.add(popAccAttr(type, incObject));
    }
    AccountGrp[] AccountGrpArr = (AccountGrp[]) accAL
            .toArray(new AccountGrp[accAL.size()]);
    return AccountGrpArr;
}

private static AccountGrp popAccAttr(AccountType type, IncomingObject incObject) {
    AccountGrp acc = new AccountGrpImpl();

    acc.setAccountType(type); // common for all

    switch (type) {
    case CUST:
        acc.setAccount(incObject.getM_clientAcronym());
        acc.setAcctIDSource(AcctIDSource.SLANG);
        acc.setGrandParentAccount(incObject.getM_grandparentNum());
        break;
    case BKR:
        acc.setAccount(incObject.getM_brokerAcronym());
        acc.setAcctIDSource(AcctIDSource.SLANG);
        // acc.setGrandParentAccount(incObject.getM_grandparentNum());
        break;
    case FIRM:
        acc.setAccount(incObject.getM_errorAccount());
        acc.setAcctIDSource(AcctIDSource.SLANG);
        acc.setAccountSubType(AccountSubType.ERROR);
        break;
    default: throw new IllegalArgumentException("unsupported account type: "+type);
    }

    return accc; // common for all
}

答案 2 :(得分:0)

你的OO设计很差:你不应该有AccountGrp[],它应该是一个类,而是具有很好命名的属性。你的代码将更具可读性和可维护性。

如果您想坚持使用当前的设计,至少应该拆分popAccAttr方法。我没有看到需要在一个内部放置3个完全不同的方法,并使用一个外壳开关。

public static AccountGrp[] popAccArr(IncomingObject incObject) {
  AccountGrp[] accountGrp = new AccountGrp[noAccounts];
  accountGrp[0] = popAccClient(incObject);
  accountGrp[1] = popAccBroker(incObject);
  accountGrp[2] = popAccError(incObject);
  return AccountGrpArr;
}

答案 3 :(得分:-1)