Какие проблемы присутствуют в данном коде и как его улучшить?

136
20 декабря 2021, 15:00
public class Stack {
private final Object[] buf;
private int position;
public Stack(int size) {
    buf = new Object[size];
}
public void push(Object o) {
    if(position > buf.length - 1)
        throw new OutOfMemoryError();
    buf[position++] = o;
}
public Object pop() {
    if(position <= 0)
        return null;
    return buf[--position];
}
public boolean isEmpty() {
    return (position == 0);
}
public boolean equals(Stack stack) {
    return buf == stack.buf;
}

}

Answer 1

В дополнение отмечу еще:

  1. Хорошо бы классу как то наследоваться от какого-либо класса из Java Collections, иначе странно, что класс Stack болтается сам по себе.
  2. Про equals() уже и написали и прокомментировали - поддержу
  3. Не хватает метода peek() - взять значение на вершине стека без выталкивания
  4. При переполнении стека надо выбрасывать исключение IndexOutOfBoundException или же тупо терять значение на дне стека сдвигая все значения ко дну
  5. Надо сделать из него Generics типа Stack<T> - код принципиально не изменится, зато станет приятнее
Answer 2

1-ое предложение:
Пишите isEmpty() в методе pop, так эта переменная мимо нуля проскочить не может.
2-ое предложение:
Если вам нужен стак с одинаковыми по типу элементами, вам стоит воспользоваться дженериками.

И у вас одна серьезная проблема:
Метод equals написан неправильно. Он сравнивает лишь ссылки на объекты. А вам нужно сравнить их содержимое. Правильное решение(если я правильно понял посыл):

@Override
public boolean equals(Object stack) {
    if(!(stack instanceof Stack)) {
        return false;
    }
    if(stack == null) {
        return false;
    }
    if(((Stack)stack).buf.length != buf.length || ((Stack)stack).position != position) {
        return false;
    }
    for(int i = 0; i < position; i++) {
        if(!((Stack)stack).buf[i].equals(buf)) {
            return false;
        }
    }
    return true;
}

И добавьте hashcode, как это советуют сделать люди из комментариев

READ ALSO
Использование VBO в LibGdx

Использование VBO в LibGdx

подскажите, как использовать VBO в libgdx? У меня проблема, что есть персонаж с костями, и их должно быть много, и проседает fps, и хотел бы ускорить...

189
Неправильно работают методы

Неправильно работают методы

Ребята, выручайте, методы не работают правильно почему-тоГеттеры и Сеттеры классов Автор и Сообщение работают исправно, они прошли тест

179
Экран в Android

Экран в Android

Экран при первом запуске называется onBoardingЕсть куча готовых решений на гитхабе

71
Word и jasperreports: большие пробелы в тексте

Word и jasperreports: большие пробелы в тексте

Имеется отчет, в котором требуется задать для TextField свойство "Выровнять текст по ширине",

171