2

Message スーパークラスがあり、WeddingMessage、GreetingMessage、FarewellMessage、Birthday Message などのさまざまな Message サブクラスがあります。

Message スーパークラスにはコンストラクターがあります。

public Message(String messageType){
        this.messageType = messageType;
}

メッセージ サブクラスはすべて異なるコンストラクターを持ちますが、すべてスーパークラスを呼び出し、そこで引数として messageType を渡します。たとえば、次のようになります。

public BirthdayMessage( String name, int age){
    super("birthday");
    System.out.println("Happy birthday " + name + "You are " + age " years old");

public FareWellMessage(String name, String message){
    super("farewell");
    System.out.println(message + " " + name);
}

作成される messageType は、ユーザーから渡された引数によって決定されます。たとえば、ユーザーが「John 12 歳の誕生日」を挿入すると、パラメータ John と 12 を使用して BirthdayMessage が作成されます。

一連の if/else ステートメントや switch ケースを使用する代わりに、次のような形式で-

words[] = userinput.slice(' ');
word1 = words[0];
if (word1 == birthday)
     create new BirthdayMessage(parameters here)
if (word1 == wedding)
    create new weddingMessage(parameters here)

リフレクションを使用して、作成するメッセージ クラスのタイプを決定するにはどうすればよいですか。私の現在の考えは、File クラスを使用して、メッセージ サブクラスを含むパッケージ内のすべてのファイルを取得することです。次に、リフレクションを使用して各コンストラクター パラメーターの型を取得し、ユーザー入力によって指定されたパラメーターと一致するかどうかを確認します。次に、これらの一致するクラスのインスタンスをランダム パラメーターで作成します。作成されると、サブクラスはそのスーパークラス コンストラクターをその messageType で呼び出します。次に、messageType 変数がユーザー入力と一致するかどうかを確認できます。

したがって、ユーザーが 'birthday john 23' と入力すると、パラメーターとして文字列と int を取り、フィールド messageType (Message から継承) を持つパッケージ内のすべてのコンストラクターが見つかります。次に、そのクラスのインスタンスを作成し、messageType がユーザー入力の最初の単語 (この場合は誕生日) に対して == であるかどうかを確認します。そうであれば、ユーザーが指定したパラメーターを使用してそのクラスのインスタンスを作成します。

リフレクションでこれを行うより良い方法はありますか?

4

3 に答える 3