10

オブジェクトを作成するためにパラメーター(intage)を受け取るパブリックコンストラクターがあります。渡されたパラメータが有効かどうかを確認したいのですが、たとえば、年齢を負にすることはできません。違法な場合は、オブジェクト/インスタンスを作成しないでください。合法であれば問題ありません。

私はこれを行うための1つの方法しか考えられません-

コンストラクターをプライベートにします。パラメータ(int age)を使用して静的メソッドを作成し、すべてのチェックを実行し、不正な値を渡した場合はnullを返します。正当な値を渡す場合は、オブジェクトを作成してその参照を返します。それを行う他の方法はありますか?たぶんコンストラクター自体の内部から?

編集: 私は上記の方法で1つの問題を考えました。ファクトリメソッド/オブジェクトクリエーターメソッドは、明らかな理由から静的メソッドにしかなり得ません。ファクトリメソッドがオブジェクトを作成するために(チェックを行うために)メンバー変数にアクセスする必要がある場合はどうなりますか?次に、そのメンバー変数を静的にすることを余儀なくされます。これはすべての場合に問題がない場合があります。

それは意味がありますか?

4

4 に答える 4

9

それを行う他の方法はありますか?たぶんコンストラクター自体の内部から?

はい。Exceptionfromコンストラクターをスローすることをお勧めします

public class Person
{


    int age;
    public Person(int age) throws Exception
    {
       if(age <= 0)
       {

          throw new Exception("Age is not allowed");
       }
       // Do some stuffs
       this.age = age;
    }

}

編集:

IllegalArgumentExceptionTillHelgeHelwigの提案に従って使用することもできます

public class Person
{


    int age;
    public Person(int age) throws IllegalArgumentException
    {
       if(age <= 0)
       {

          throw new IllegalArgumentException("Age is not allowed");
       }
       // Do some stuffs
       this.age = age;
    }

}
于 2013-01-18T07:56:22.840 に答える
6

この例を考えてみましょう。これはjava.util.HashMapの実装です。

public HashMap(int initialCapacity, float loadFactor) {
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal initial capacity: " +
                                           initialCapacity);
    if (initialCapacity > MAXIMUM_CAPACITY)
        initialCapacity = MAXIMUM_CAPACITY;
    if (loadFactor <= 0 || Float.isNaN(loadFactor))
        throw new IllegalArgumentException("Illegal load factor: " +
                                           loadFactor);

    // Find a power of 2 >= initialCapacity
    int capacity = 1;
    while (capacity < initialCapacity)
        capacity <<= 1;

    this.loadFactor = loadFactor;
    threshold = (int)(capacity * loadFactor);
    table = new Entry[capacity];
    init();
}

Effective Java 2nd Edition, Item 38: Check parameters for validity上記のコードの作者でもあるJoshuaBlochによる詳細を参照してください

于 2013-01-18T08:19:50.960 に答える
3

この目的には静的ファクトリを使用することをお勧めします。コンストラクターから例外をスローするのはあまり良い考えではないからです。

public class Person
{     
    public static Person newPerson(int age) /* throws SomeException -- if you want */ {
        if (age <= 0 || age >= 150) {
           return null; // or throw an Exception - it is how you want   
        }
        return new Person(age);
    }

    private Person(int age) {
        // assign age to field value
    }
}
于 2013-01-18T08:05:17.437 に答える
1

Exceptionパラメータが不正な場合は、スローします。

public Test(int age) throws IllegalArgumentException {
    if(age<0)
        throw new IllegalArgumentException(...);
    this.age = age;
}
于 2013-01-18T07:59:37.260 に答える