Сравнивая цветовую гамму с ==


Это пример из кода фрагмент выложенного на переполнение стека:

private double brickVal(Color c) {
    if (c == Color.RED) {
        return 10.0;
    } else if (c == Color.ORANGE) {
        return 8.0;
    } else if (c == Color.YELLOW) {
        return 6.0;
    } else if (c == Color.GREEN) {
        return 4.0;
    } else if (c == Color.CYAN) {
        return 2.0;
    } else if (c == Color.MAGENTA) {
        return 1.0;
    } else {
        return 1.0;
    }
}

Использование == вот правильная / лучшая практика?



13215
7
задан 23 апреля 2011 в 12:04 Источник Поделиться
Комментарии
4 ответа

Нет, это не правильно (и так конечно тоже не лучшая практика). Например, условие с == Цвет.Зеленый будет true, если метод называется brickVal(цвет.Зеленый), но значение false, если это называется brickVal(новый цвет(0, 255, 0)). Так Как Цвет.Зеленый равно новый цвет(0, 255, 0) такое поведение скорее всего неумышленное (по крайней мере я не могу представить сценарий, где вы хотите для brickVal(цвет.Зеленый) вести себя иначе, чем brickVal(новый цвет(0,255,0)).

Конечно, если вы знаете, что этот метод будет только когда-либо использоваться "готовые" цвета и не используя новый цвет, он будет вести себя правильно. Однако я бы все-таки советовал бы использовать ==. Я не вижу хорошая причина, чтобы не использовать равно и с помощью == приходит с опасностью, что кто-то может назвать brickVal с новым цветом в любом случае, не зная, что они не должны.

Далее, учитывая тот факт, что brickVal , очевидно, предназначается, чтобы быть только называют какие-то конкретные цвета в качестве аргументов и он не использует каких-либо свойств цвета другие, чем их идентичности, я думаю, что перечисление может быть более подходящим, чем здесь с помощью цветной класса. Таким образом, вы можете использовать переключатель , а не если ... еще, если ... и не придется беспокоиться ни о ком, переходя в новый цвет в качестве аргумента.


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

13
ответ дан 23 апреля 2011 в 02:04 Источник Поделиться

Моя взять на это, что это плохая практика.

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

Проблема в том, что это может быть глобальной (приложению) инвариант. Любое изменение любого класса может потенциально вводить новые цвета объектов и нарушение инварианта. Короче приложение-это в лучшем случае "хрупкое".

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

По этим причинам, я считаю, что такой подход является плохой практикой ... ли он глючит в контексте приложения.

5
ответ дан 23 апреля 2011 в 02:04 Источник Поделиться

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

import java.awt.Color;

class ColorTest {

public static void main(String args[]) {
Color c1 = Color.RED;
Color c2 = new Color(255,0,0);
System.out.println(c1 == c2); //false - not pointing to the same object
System.out.println(c1.equals(c2)); //true - both are red
}
}

Именно поэтому все объекты Java есть метод Equals() метод, который наследуется из объекта класса: мы не волнует, где физически хранятся в памяти, мы заботимся о том, что он представляет.

Редактировать: чтобы ответить на вопрос "Является ли это хорошей практикой", я бы сказал, Нет это не так.

4
ответ дан 24 апреля 2011 в 09:04 Источник Поделиться

Не очень хорошая практика.

Таким образом, как это кажется, вы хотите использовать цвета - вещь, которая имеет значение. Вы хотите знать, если фактический цвет такой же. Это не имеет значения, если это 2 разных объекта, которые имеют одинаковые значения или один и тот же объект. И == проверяет, если это один и тот же объект.
то, что вы хотите использовать метод Equals() , поскольку метод Equals() проверяет, если два цвета имеют одинаковые значения.

3
ответ дан 24 апреля 2011 в 04:04 Источник Поделиться