Objective C двухфазная конструкция объектов

Ответ Ганезана выше не верен, и StackOverflow не позволяет мне комментировать или редактировать его сообщение. Так что ниже правильный ответ. Ganesan имеет неверную «[» и пропускает проверку isEmpty () стека.

Приведенный ниже код вернет true, если фигурные скобки соответствуют друг другу.

public static boolean isValidExpression(String expression) {
    Map<Character, Character> openClosePair = new HashMap<Character, Character>();
    openClosePair.put(')', '(');
    openClosePair.put('}', '{');
    openClosePair.put(']', '[');

    Stack<Character> stack = new Stack<Character>();
    for(char ch : expression.toCharArray()) {
        if(openClosePair.containsKey(ch)) {
            if(stack.isEmpty() || stack.pop() != openClosePair.get(ch)) {
                return false;
            }
        } else if(openClosePair.values().contains(ch)) {
            stack.push(ch); 
        }
    }
    return stack.isEmpty();
}
13
задан Andy White 4 June 2009 в 00:59
поделиться

2 ответа

У меня завидная ситуация, когда я работаю на парня, который написал + alloc еще в 1991 году, и несколько месяцев назад я задал ему очень похожий вопрос. Добавление + alloc было сделано для того, чтобы предоставить + allocWithZone: , что было сделано для того, чтобы добавить пулы памяти в NeXTSTEP 2.0, где память была очень ограничена (4M). Это позволяло вызывающей стороне управлять размещением объектов в памяти. Это была замена + new и его родственников, которые были (и продолжают быть, хотя никто не использует) однофазным конструктором, основанным на Smalltalk new . Когда Cocoa перешел в Apple, использование + alloc уже укоренилось, и не было возврата к + new , даже если на самом деле выбор NSZone редко имеет большое значение.

Так что это не большой философский вопрос, состоящий из одной фазы или двух фаз. На практике какао имеет однофазную конструкцию, потому что вы всегда (и всегда должны) вызывать их последовательно в одном вызове без проверки + alloc . Вы можете думать об этом как о сложном способе ввода слова «новый».

28
ответ дан 1 December 2019 в 20:11
поделиться

Мой опыт работы с С ++, но одним из недостатков однофазной инициализации С ++ является обработка наследования / виртуального функции. В C ++, вы не можете вызывать виртуальные функции во время построения или разрушения (ну, вы можете, он просто не будет делать то, что вы ожидаете). Двухэтапная инициализация может решить эту проблему (частично. Насколько я понимаю, она будет перенаправлена ​​в нужный класс, но инициализация, возможно, еще не завершена. Вы все еще можете что-то с этим делать) (я все еще поддерживаю одна фаза)

В C ++, вы не можете вызывать виртуальные функции во время построения или разрушения (ну, вы можете, он просто не будет делать то, что вы ожидаете). Двухэтапная инициализация может решить эту проблему (частично. Насколько я понимаю, она будет перенаправлена ​​в нужный класс, но инициализация, возможно, еще не завершена. Вы все еще можете что-то с этим делать) (я все еще поддерживаю одна фаза)

В C ++, вы не можете вызывать виртуальные функции во время построения или разрушения (ну, вы можете, он просто не будет делать то, что вы ожидаете). Двухэтапная инициализация может решить эту проблему (частично. Насколько я понимаю, она будет перенаправлена ​​в нужный класс, но инициализация, возможно, еще не завершена. Вы все еще можете что-то с этим делать) (я все еще поддерживаю одна фаза)

3
ответ дан 1 December 2019 в 20:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: