Професионална програма
Loading...
+ Нов въпрос
MartinBG avatar MartinBG 2781 Точки
Best Answer

На пръв поглед забелязвам следните неща:

 

1. Името на тази статична променлива е като за константа, но не я използваш като такава в кода си и от там идват поне част от проблемите:

 

private static int INITIAL_CAPACITY = 2;

 

Пример:

Какво, ще отпечата следната демо програма на конзолата?

public class Demo {

    public static void main(String[] args) {
        ReversedList<Integer> reversedList = new ReversedList<>(4);
        System.out.println(reversedList.capacity());

        ReversedList<Integer> reversedList2 = new ReversedList<>();
        System.out.println(reversedList2.capacity());
    }
}

 

По условие би трябвало да бъде 4 и 2, но ще получим 4 и 4.

 

Още "по-забавно" става, когато инстанциите на класа започнат да се преоразмеряват и да презаписват статичното INITIAL_CAPACITY, което се използва едновременно от всички.

За справяне с проблема най-правилно е да имаме още едно поле в класа - напр. capacity.

 

2. Конструктори:


    public ReversedList(int capacity) {
        INITIAL_CAPACITY = capacity;
        new ReversedList();
    }
 
    public ReversedList() {
        count = 0;
        elements = (T[]) new Object[INITIAL_CAPACITY];
    }

Първият конструктор със сигурност не работи така, както си очакваш

Това, което се случва е следното:

  1. Сетва се нова стойост на INITIAL_CAPACITY 
  2. Създава се нова инстанция на ReversedList чрез извикване на дефолтния конструктор
  3. Излиза се от конструктора като инстанцията, създадена в т.2 също излиза от скоуп и съответно бива изтрита
  4. В кода, който е извикал конструктора получаваме инстанция на класа, която има дефолтни стойности за всички полета, без INITIAL_CAPACITY

Това, което най-вероятно си имал предвид е да извикаш дефолтния конструктор за да инициализираш обекта.

Това става с this() :

    public ReversedList(int capacity) {
        INITIAL_CAPACITY = capacity;
        this();
    }

 

Това е кода с горните корекции - не съм го проверявал в Judge, че не мога да се ориентирам какво да събмитна тамblush

0
lapd87 avatar lapd87 101 Точки

Здравей,

както винаги помогна супер много!

Позабравил съм ги нещата след 4-5 месеца само JS... Ако бях се сетил да проверя с нещо като демото ти щяха да излязат нещата :)

Благодаря отново!

1