Предложение для шаблона именования, который пытается бросить, возвращая ноль, если операция не удалась

Я видел эту модель во многих местах, но никогда не видел ее названной.

Я больше после предложения о том, как назвать методы, которые его реализуют, так как разные люди, похоже, используют разные схемы именования.

Извините, я не могу вспомнить какие-либо библиотеки в качестве примеров, но если вы используете одну из них как часть вашего ответа, пожалуйста, назовите их.

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, я верю. В любом случае, это происхождение не имеет значения, но здесь у нас есть два очень хорошо известных продукта, которые делают именно то, что я описываю...

http://code.google.com/p/google-web-toolkit/source/browse/trunk/dev/core/src/com/google/gwt/core/ext/typeinfo/JType.java

Есть много других 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(),

Другие вопросы по тегам