Сравнивая Символ, Целое число и подобные типы в Java: Использование равняется или ==?

Вам нужно вызвать validate по $ request, например:

$request->validate([
    'Name'=>'required',
    'UserName'=>'required',
    'Password'=>'required|min:6',
    'email'=>'required|email',
]);

. Вот полный код:

public function update(Request $request, $id)
{
    $request->validate([
        'Name'=>'required',
        'UserName'=>'required',
        'Password'=>'required|min:6',
        'email'=>'required|email',
    ]);

    if (!$validator->fails()) {
        $updateInfo= Info::findOrFail($id);
        $updateInfo->user_id = $request->input('user_id');
        $updateInfo->Name = $request->input('Name');
        $updateInfo->UserName = $request->input('UserName');
        $updateInfo->Password = $request->input('Password');
        $updateInfo->save();
    } else {
       \Session::flash('error', $validator->messages()->first());

        return redirect()->back()->withInput();
    }


    return redirect('/info');
}

. Я добавил еще одно условие в код для обработки ошибки проверки. Если проверка не пройдена, она будет перенаправлена ​​обратно вместе с вашими данными и сообщениями об ошибках проверки. Убедитесь, что у вас есть вспышка сеанса ошибок в ваших блейд-представлениях, чтобы показать ошибки.

10
задан Uri 9 April 2009 в 20:42
поделиться

8 ответов

РЕДАКТИРОВАТЬ: Спецификация дает некоторые гарантии для преобразования в бокс. Из , раздел 5.1.7 :

Если значение p в штучной упаковке равно true, false, байт, символ в диапазоне \ u0000 до \ u007f, или int или short число от -128 до 127, то пусть r1 и r2 будут результатами любых двух конверсии бокса р. Это всегда имейте в виду, что r1 == r2.

Реализация может использовать больший пул.

Я бы действительно избегал написания кода, который полагается на это. Не потому, что он может потерпеть неудачу, а потому, что это не очевидно - мало кто будет хорошо знать спецификацию. (Раньше я думал, что это зависит от реализации.)

Вы должны использовать , равно или сравнить базовые значения, т. Е.

if (foo.equals(bar))

или

if (foo.intValue() == bar.intValue())

. Обратите внимание, что даже если в автобоксе гарантированно использовались фиксированные значения другие вызывающие всегда могут всегда создавать отдельные экземпляры.

30
ответ дан 3 December 2019 в 13:24
поделиться
//Quick test
public class Test {
  public static void main(String[] args) {
    System.out.println("Are they equal? "+ (new Long(5) == new Long(5)));
  }
}

Вывод:

«Они равны? 0»

Ответ:

Нет, они не равны. Вы должны использовать .equals или сравнить их примитивные значения.

4
ответ дан 3 December 2019 в 13:24
поделиться

Если вы хотите сравнить что-либо со значением какого-либо объекта, используйте .equals () .

Даже (и особенно), если эти объекты являются примитивной оболочкой типы Byte, Character, Short, Integer, Long, Float, Double и Boolean.

" == " только когда-либо сравнивает идентичность объекта, и вы очень, очень редко, что вы хотите. И де-факто никогда не получайте то, что вы хотите от примитивных оболочек.

Используйте == только в одном из этих двух сценариев:

  1. все значения, участвующие в сравнении, являются примитивными типами (и предпочтительно не плавающими) номера точек)
  2. вы действительно хотите знать, ссылаются ли две ссылки на один и тот же объект (это включает сравнение enum s, потому что там значение привязано к идентичности объекта)
7
ответ дан 3 December 2019 в 13:24
поделиться

Спецификация языка Java 5.1.7 :

Если значение p в штучной упаковке равно true, false, байт, символ в диапазоне \ u0000 до \ u007f, или int или short число от -128 до 127, то пусть r1 и r2 будут результатами любых двух конверсии бокса р. Это всегда случай, когда r1 == r2.

и:

Обсуждение

В идеале, боксировать данный примитив значение р, всегда будет давать идентичная ссылка. На практике это может быть невозможным с использованием существующих методы реализации. Правила выше прагматичный компромисс. Заключительный пункт выше требует, чтобы определенные общие значения всегда должны быть в штучной упаковке в неразличимые объекты. реализация может кэшировать их, лениво или с нетерпением.

Для других значений, эта формулировка не допускает никаких предположений о идентичность в штучной упаковке значений на программист Это позволило бы (но не обязательно) обмен некоторыми или все эти ссылки.

Это гарантирует, что в большинстве случаи, поведение будет желаемый, без наложения ненужного снижение производительности, особенно на небольшие устройства. Меньше памяти реализации могут, например, кэшировать все символы и шорты, как а также целые и длинные в диапазон -32K - + 32K.

Так, в некоторых случаях == будет работать, во многих других это не будет. Всегда используйте .equals, чтобы быть в безопасности, так как вы не можете получить (как правило) информацию о том, как были получены экземпляры.

Если скорость является фактором (большинство .equals начинаются со сравнения == или, по крайней мере, они должны) И вы можете гарантировать, как они были распределены и соответствуют указанным выше диапазонам, тогда == является безопасным.

Некоторые виртуальные машины могут увеличить этот размер, но безопаснее предположить наименьший размер, указанный в спецификации языка, чем полагаться на конкретное поведение виртуальной машины, если вам действительно очень нужно.

4
ответ дан 3 December 2019 в 13:24
поделиться

Реализации метода equals (Object o) почти всегда начинаются с

if(this == o) return true;

, поэтому использование равно , даже если == - правда, это на самом деле не слишком много для снижения производительности.

Я рекомендую всегда * использовать метод equals для объектов.

* конечно, есть очень немного когда вам не следует принимать этот совет.

2
ответ дан 3 December 2019 в 13:24
поделиться

Стоит отметить, что в автоматически упакованных значениях будет использоваться объект из пула, если он доступен. Вот почему (целое число) 0 == (целое число) 0, но (целое число) 128! = (Целое число) 128 для Java 6u13

1
ответ дан 3 December 2019 в 13:24
поделиться

Общий ответ: нет , вам не гарантируется, что для одного и того же числового значения объекты Long, которые вы получаете, одинаковы (даже если вы ограничиваетесь использованием Long .valueOf ()).

Однако возможно, что вы получите улучшение производительности, сначала попытавшись проверить равенство ссылок (используя ==), а затем, в случае неудачи, попытайтесь использовать equals (). Все это зависит от сравнительных затрат на дополнительный тест == и вызов метода ... Ваш пробег может варьироваться, но стоит попробовать простой цикл теста, чтобы увидеть, что лучше.

1
ответ дан 3 December 2019 в 13:24
поделиться

== сравнивает ссылку на объект, а equals (Object obj) сравнивает на предмет равенства. Если когда-либо может существовать более одного экземпляра объекта равенства , то вы должны использовать equals для сравнения на равенство.

Примеры:

Integer i1 = new Integer(12345);
Integer i2 = new Integer(12345);

это разные экземпляры объекта, но они равны в соответствии с равенством Integer, поэтому вы должны использовать equals (Object obj)

public enum Gender {
    MALE, FEMALE;
}

, в этом случае будет только один экземпляр FEMALE , поэтому == безопасно для использования.

0
ответ дан 3 December 2019 в 13:24
поделиться
Другие вопросы по тегам:

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