-1

次のコードがあります。

for(President obj : SomeClass.SomeObject(President.class))
{
    System.out.println(obj.getFullText());
}

ここには、President、Car、Train、Product、MaleName、FemaleName など、さまざまな種類のクラスがあり、実際には膨大なリストがあります。これらのすべてのクラスには、メソッド getFullText() が含まれています。

今、書く代わりに:

for(President obj : SomeClass.SomeObject(President.class))
{
    System.out.println(obj.getFullText());
}

for(Car obj : SomeClass.SomeObject(Car.class))
{
    System.out.println(obj.getFullText());
}

.. and so on

「President」、「Car」、「Product」などのすべての名前の文字列表現を取り、その特定のクラスオブジェクト「obj」でこのメソッドを呼び出して、ループ内でこのメソッドの戻り値でやりたいことができます。

4

2 に答える 2

5

答えは、リフレクションを使用することです。しかし、これは複雑で、注意しないとあらゆる種類の微妙な問題につながります。

最善の方法は、これを行う必要がないように設計を再考することです。1 つのオプションは、ファクトリ パターンを使用することです。

于 2013-01-06T12:54:05.573 に答える
4

クラスに引数のない public コンストラクターがあり、呼び出されると仮定すると、次のようにクラスがcom.mydomain.app.Car読み込まれ、コンストラクターが呼び出されます。

Class<?> clazz = Class.forName("com.mydomain.app.Car");
Car car = (Car) clazz.newInstance();

それはリフレクションと呼ばれます。しかし、特別な種類の問題のために、めったに使用されるべきではありません。あなたが実際に達成したいことを私たちに教えてください. たとえば、ファクトリ パターンを使用できます。

public interface Drivable {
    public void drive();
}

public class Car implements Drivable {
    ...
}

public class Bus implements Drivable {
    ...
}

public class DrivableFactory {
    public static Drivable create(String kind) {
        if ("bus".equals(kind)) {
            return new Bus();
        }
        else if ("car".equals(kind)) {
            return new Car();
        }
        else {
            throw new ImmegalArgumentException("sorry, I can't create " + kind);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Drivable d = DrivableFactory.create(args[0]);
        d.drive();
    }
}
于 2013-01-06T12:55:45.907 に答える