Предложение для шаблона именования, который пытается бросить, возвращая ноль, если операция не удалась
Я видел эту модель во многих местах, но никогда не видел ее названной.
Я больше после предложения о том, как назвать методы, которые его реализуют, так как разные люди, похоже, используют разные схемы именования.
Извините, я не могу вспомнить какие-либо библиотеки в качестве примеров, но если вы используете одну из них как часть вашего ответа, пожалуйста, назовите их.
public class Produce{
package private Produce(){};
Fruit isFruit(){
return null;
}
Veg isVeg(){
return null;
}
}
public class Veg extends Produce {
package private Veg(){};
Veg isVeg(){
return this;
}
}
public class Fruit extends Produce {
package private Fruit(){};
Fruit isFruit(){
return this;
}
}
ДОПОЛНИТЕЛЬНЫЙ
@LouisWasserman
Во-первых, количество подтипов Produce ограничено тем, что его пакет ctor закрыт. Включение 2-х методов isXXX, подчеркивающих факт, есть только 2 подкласса, что лучше, чем выполнение проверок экземпляра. Может быть, это только я, но этот подход также означает, что нет никаких приведений в другом коде или выше, что должно быть хорошо, верно?
Также не возвращает пустой список из метода, когда поиск или запрос терпит неудачу, почти так же, как и возврат null, чтобы отметить, что операция isFruit() завершилась неудачно при попытке привести Veg к Fruit?
Я нашел быстрый пример в GWT в JType, который является клоном Eclipse JDT, я верю. В любом случае, это происхождение не имеет значения, но здесь у нас есть два очень хорошо известных продукта, которые делают именно то, что я описываю...
Есть много других isXXX, которые пытаются разыграть или вернуть null, я вставил несколько ниже.
/**
* Returns this instance as a {@link JAnnotationType} if it is an annotation
* or <code>null</code> if it is not.
*/
JAnnotationType isAnnotation();
JArrayType isArray();
JClassType isClass();
JClassType isClassOrInterface();
/**
* Returns this instance if it is an enumeration or <code>null</code> if it is
* not.
*/
JEnumType isEnum();
JGenericType isGenericType();
1 ответ
Прежде всего, я думаю, что это ужасная картина. Суперкласс, как правило, не должен знать о своих подклассах.
Что делать, если вы добавите еще один подкласс Produce
? Вам нужно будет помнить, чтобы изменить Produce
, Ошибка склонна.
Чтобы ответить на ваш вопрос, хотя, я бы избегал isFruit
, поскольку пользователи могут ожидать, что он вернет логическое значение. Если бы заставили использовать этот шаблон, я бы, вероятно, использовал getFruit()
или же asFruit()
,