инициализация переменной-члена вместо переменной экземпляра

1

У меня возникли проблемы с классом arrayList который представляет список объектов и поддерживает произвольный доступ к его объектам с помощью индекса числовой позиции.

После разработки проблем с toString() и size() меня возникла проблема, когда я не инициализирую мой массив-член; только инициализация переменной локали. Однако у меня сложилось впечатление, что сделанная мной модификация должна решить проблему.

public Object get(int a) {
    if (a < 0 || a >= logicalSize) {
        throw new IndexOutOfBoundsException("Positions must be from position 0 to position "+
                                            (logicalSize - 1));
    }
    else {
        return array[a];
    }
} 

Но не должно мое объявление private static Object[] array = new Object[5]; решить это?

В настоящее время я получаю ошибку, бросая мое исключение, сообщая мне, что моя позиция должна быть от 0 до -1, предполагая, что она не создана.

Полный код:

public class Tester  {
        public static void main(String [] args)
        {
            arrayList a1, a2;
            a1 = new arrayList();
            a2 = new arrayList(5);
            a2.size();
            System.out.println(a1.toString());
            //System.out.println(a2.toString());
        }
    }

public class arrayList
{
    private int logicalSize;
    private static Object[] array = new Object[0];
    private Object[] original;
    private Object removedElement;

    public arrayList()
    {
        Object[] array = new Object[]{null,null,null,null,null}; 
    }

    public arrayList(int i)
    {
        logicalSize = i;
        Object[] array = new Object[logicalSize - 1];
    }

    public arrayList(Object[] array)
    {
       logicalSize = array.length;
       Object[] copyArray = array;
    }

    public String toString(Object[] array)
    {
       String str = " ";

       for(int a = 0; a < logicalSize; a++)
       {
          str = str + array[a];
       }

       str = str + "\nSize: " + size();
      return str;
   }  

   public int size()
   {
       int length = array.length;
       return length;
   }
}

Большое спасибо, Packerfan504

  • 0
    Почему array статичен?
  • 0
    Кроме того, это сбивает с толку, потому что имена классов должны быть заглавными
Показать ещё 1 комментарий
Теги:
arraylist

2 ответа

1
Лучший ответ

Во-первых, вы должны следовать соглашениям Java для имен классов. Он должен начинаться с прописной буквы и идти CamelCase.

array безусловно, не должен быть static. Когда вы объявляете элемент static, это означает, что он разделяется между всеми экземплярами

В конструкторах вы устанавливаете локальные переменные вместо члена.

 // remove Object[] in front
 array = new Object[]{null,null,null,null,null};

Конструктор из массива не устанавливает array элементов.

public arrayList(Object[] array)
{
   logicalSize = array.length;
   //Object[] copyArray = array;
   this.array = array;
}

Это не делает никакой копии: элемент ссылается на массив, переданный как параметр. Мне нужен какой-то "конструктор копирования", вам нужно создать экземпляр нового массива и скопировать каждый элемент. Или используйте Arrays.copyOf().

Вы должны переопределить метод toString() из java.langObject с правой подписью (зачем передавать массив как парметер?). Все классы в Java неявно расширяют класс Object.

Вы должны различать размер массива Object[] - это число потенитальных слотов, которые у вас есть до того, как потребуется увеличение массива, и логический размер, который отражает количество элементов, которые вы положили в свой массив. Здесь вы устанавливаете логический размер array.length, то есть просто избыточную информацию.


EDIT Дополнительные советы

В конструкторе с параметром size в качестве параметра вы создаете массив (logicalSize-1). Зачем?

В конструкторе по умолчанию вы не инициализируете logicalSize, а затем устанавливаете значение 0. Это нормально для меня, но тогда, почему вы устанавливаете его в i в конструкторе с параметром размера? Тогда это нормально, что в a1.get(0):

if (a < 0 || a >= logicalSize) {...}

является true и генерирует исключение.

Я бы рекомендовал вам разъяснить роль logicalSize которая (для меня) - количество фактических объектов в ArrayList. Обратите внимание, что в вашем тесте вы еще ничего не помещаете в свой массив. Даже если у вас есть внутренний массив, который может содержать 5 объектов, пока вы не add(...) что-то, вызов get(0) должен вызвать исключение.

  • 0
    Обновленная версия моего кода по-прежнему не решает проблему для конструктора по умолчанию, но делает это для конструктора ArrayList (int i). Я не уверен, как мне следует это исправить. Новый код: pastebin.com/sfUeCXG1
  • 0
    Хорошо, я вижу несколько страниц. Я добавлю правку в мой ответ.
Показать ещё 2 комментария
0

У вас есть статическая переменная класса

private static Object[] array 

и в вашем конструкторе вы создаете локальный массив переменных;

т.е. делать это

Object[] array 

снова собирается создать локальную переменную для этой функции.

так как вы снова объявили Object [], что это будет переменная в пределах области конструктора.

  • 0
    Я все еще в замешательстве. Я удалил статическую часть из переменной, но она все еще выдает ту же ошибку. Как меняется это с публичного на частное. Как мне сделать так, чтобы это больше не было чисто локальной переменной? Я изменил его на private int logicalSize; private Object[] array = new Object[5]; private Object[] original; private Object removedElement; public ArrayList() { array = new Object[5]; }
  • 0
    да, это должно работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню