【问题标题】:Bypass max array size in no arg constructor在无 arg 构造函数中绕过最大数组大小
【发布时间】:2017-11-22 06:49:27
【问题描述】:

在添加新号码时,我正在尝试通过默认设置取消限制。我希望在初始化时设置的全参数构造函数仍然有限制,但对无参数和 1 参数构造函数没有限制。

public class SMSDataModelList implements SMSDataModelInterface, Serializable {

    List<String> list = new ArrayList<String>();
    //List<String> list = new LinkedList<String>();

    private static final long serialVersionUID = 1L;
    private static final int DEFAULT_MAX_NUM_PHONE_NUMBERS = 20;

    public static final String FULL = "FULL";
    public static final String DUPLICATE = "DUPLICATE";

    private String message;     //The SMS message
    private String[] phoneNumbers;      //The collection of phone numbers
    private int maxNumPhoneNumbers;     //Max numbers in list

    public SMSDataModelList(String message) {
        this(message, DEFAULT_MAX_NUM_PHONE_NUMBERS);
    }   

    public SMSDataModelList() {
        this("", DEFAULT_MAX_NUM_PHONE_NUMBERS);
    }

    public SMSDataModelList(String initialMessage, int maxNumPhoneNumbers) {
        this.message = initialMessage;
        this.maxNumPhoneNumbers = maxNumPhoneNumbers;
        this.phoneNumbers = new String[maxNumPhoneNumbers];
    }

    @Override
    public String addPhoneNumber(String newPhoneNumber) {
        String result;

        if (list.size() == maxNumPhoneNumbers) {
            result = FULL;

        } else {
            boolean exists;
            exists = findPhoneNumberIndex(newPhoneNumber) != -1;

            if (exists) {
                result = DUPLICATE;
            } else {
                list.add(newPhoneNumber);
                result = newPhoneNumber;
            }
        }

        return result;
    }       
}

我已尝试将其添加到 addPhoneNumber 方法中:

if (DEFAULT_MAX_NUM_PHONE_NUMBERS == 20) {
    maxNumPhoneNumbers = (list.size() + 1);
}

我认为这在测试 no-arg 和 1-arg 构造函数时效果很好,但是当涉及到 all-arg 时,我注意到它也允许数组大小在那里增加。我现在明白为什么错了,但不确定我是否走在正确的轨道上。

我真的可以让 no-arg 和 1-arg 构造函数具有无限的数组大小和静态默认值吗?

【问题讨论】:

    标签: java arrays list arraylist constructor


    【解决方案1】:

    如果我理解您的意思,您的构造函数中似乎需要另一个标志,以指示电话数量是否应限制为初始最大数量:

    public SMSDataModelList(String message) {
        this(message, DEFAULT_MAX_NUM_PHONE_NUMBERS, false);
    }   
    
    public SMSDataModelList() {
        this("", DEFAULT_MAX_NUM_PHONE_NUMBERS, false);
    }
    
    public SMSDataModelList(String initialMessage, int maxNumPhoneNumbers) {
        this(initialMessage, maxNumPhoneNumbers, true);
    }
    
    public SMSDataModelList(String initialMessage, int maxNumPhoneNumbers, boolean limited) {
        this.message = initialMessage;
        this.maxNumPhoneNumbers = maxNumPhoneNumbers;
        this.phoneNumbers = new String[maxNumPhoneNumbers];
        this.limited = limited;
    }
    

    您可以使用limited 标志来确定phoneNumbers 数组变满时是否可以增加 - 您需要向addPhoneNumber 添加逻辑以检查该标志。

    附:我刚刚注意到您的构造函数和实例变量与addPhoneNumber 方法不匹配。构造函数初始化一个数组来存储电话号码,而addPhoneNumber 方法使用ArrayList。您应该决定要使用两者中的哪一个。 ArrayList 会更容易,因为您不必在现有数组变满时重新分配新数组。

    【讨论】:

    • 这是我第一次尝试使用ArrayList,我不知道我在这里做错了什么。我有一个仅使用数组的类似程序,但我似乎无法将其转换为 ArrayList
    • @azzabloom 你在哪里存储电话号码?在List&lt;String&gt; list = new ArrayList&lt;String&gt;()private String[] phoneNumbers 中?你应该选择一个。
    • 我修好了,现在是List&lt;String&gt; phoneNumbers = new ArrayList&lt;String&gt;(),我删除了数组引用。在全参数构造函数中,我将其更改为this.phoneNumbers = new ArrayList(maxNumPhoneNumbers);,一切正常。我仍然不明白如何删除 0-arg 和 1-arg 构造函数的 maxNumPhoneNumbers 限制。
    • 按照建议使用了一个标志并让它工作,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2020-02-08
    • 2015-11-26
    相关资源
    最近更新 更多