0

このパターンは多くの場所で見てきましたが、名前が付けられているのを見たことがありません。

さまざまな人がさまざまな命名パターンを使用しているように見えるため、それを実装するメソッドに名前を付ける方法についての提案を求めています。

申し訳ありませんが、例としてライブラリを思い出すことはできませんが、回答の一部としてライブラリを使用する場合は、名前を付けてください。

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

まず、ctor パッケージを非公開にすることで、Produce のサブタイプの数が制限されます。2 つの isXXX メソッドを含めることで、サブクラスが 2 つしかないという事実を示しています。これは、instanceof チェックを行うよりも優れています。たぶん私だけかもしれませんが、このアプローチは、他のコードや上記にキャストがないことも意味します。これは良いことですよね?

また、Veg を Fruit にキャストしようとしたときに操作 isFruit() が失敗したことを示すために null を返すのと同じように、検索またはクエリが失敗したときにメソッドから空のリストを返していませんか?

私が信じているEclipse JDTのクローンであるJTypeのGWTで簡単な例を見つけました。とにかく、その起源は問題ではありませんが、ここには、私が説明していることを正確に行う2つの非常によく知られている製品があります...

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

null をキャストまたは返すことを試みる isXXX は他にもたくさんあります。以下にいくつか貼り付けます。

/**
* 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();
4

1 に答える 1

1

まず、これはひどいパターンだと思います。通常、スーパークラスはそのサブクラスを認識しません。

の別のサブクラスを追加するとどうなりますProduceか? 忘れずに変更する必要がありますProduce。エラーを起こしやすい。

ただし、あなたの質問に答えるためisFruitに、ユーザーはブール値を返すと予想する可能性があるため、 は避けます。このパターンを強制的に使用する場合は、おそらくgetFruit()orを使用しますasFruit()

于 2012-05-31T09:14:10.353 に答える