9

だから私はいくつかのEffective Javaを読んでいます!この本の中で最も刺激的なセクションの 1 つは、Bloch が "Builder" (単なる POJO ではなくクラス) について書いている Immutable Object/Builder セクションです。

注: ここではモデル オブジェクトについて話しています。たとえば、ArticleCarなどです。

これは、以前にこれらのオブジェクトを書いた方法です。

public class Car {

     private String name;

     public void setName(String name) {
         this.name = name;
     }

     public String getName() {
         return name;
     }
}

ご覧のとおり、この設計には多くの点で欠陥があり、可変性が必要であり、最初にコンストラクターを使用してオブジェクトを構築し、次に名前を設定する必要があります。

もちろん、nameフィールドを final にして、コンストラクターの引数として使用することもできますが、たとえば多数の SQL テーブルをラップする大きなオブジェクトがある場合は、次のような醜いコンストラクターが作成されます。

public Car(int horsepowers, String name, String brand, int yearManufactured,
    User owner, List<User> previousOwners) {
    //Set the values
}

これは、オブジェクトを作成するときに読み取れなくなります。これはたった 6 つのフィールドです!

したがって、ブロッホは次のことを提案しています(不変性を伴う)

public class Car {

     public static class Builder {

         private String name;

         public Builder setName(String name) {
             this.name = name;
             return this;
         }

         public Car build() {
             reeturn new Car(this);
         }
     }

     private final String name;

     private Car(Builder builder) {
         name = builder.name;
     }

     public String getName() {
         return name;
     }
}

//Construction example
Car car = new Car.Builder().setName("Speedy").build();

これで不変性が得られます。また、プリミティブまたは不変ではないオブジェクトがある場合は、それらをBuilderのセッターにコピーし、Carのゲッターに再度コピーします。

しかし、それは非常に冗長で、クラスが十分に小さい場合はコンストラクター引数を使用してきました。クラスに可変フィールドが必要な場合、クラスに十分なプロパティ (> 4 何か) がある場合は、そのフィールドを可変にします。

もう 1 つの問題は、Android を使用していて、クラスにたとえばBitmap.

このような質問をたくさん見てきましたが、この質問に対する適切な答えを見つけることができないようです。これらの設計に標準はありますか?また、その設計はどのようになっていますか? メリット/デメリットは?

前もって感謝します!

編集:

質問は:

不変である必要があり、A) 少数のフィールドと B) 多数のフィールドを持つオブジェクト モデルを構築する最良の方法は何ですか? Bitmap上記の問題および同様の問題を処理するにはどうすればよいですか? 特定のフィールドを変更可能にしますか?

曖昧でごめんなさい。

4

3 に答える 3

2

これを「回答」として入力しているので、説明するスペースがありますが、これは実際には Adam Aroid によって開始されたスレッドへの単なるコメントです。

ヨハン、まず第一に、Effective Java の項目 2 について話していると思います。

そこに示されているのは、Adam Aroid が言及した Builder パターンの形式であることに注意してください。Josh Bloch は、Effective Java でこのコードを示す直前に、これについて言及しています。(それは 13 ページにあります。) 彼は後で別のパターンを使用する方法について言及しています (同じ本から):

ヨハン、あなたがした質問はここのスペースには広すぎます。最良の答えは Adam Aroid の答えだと思います。これは、ある程度の研究が必要であり、その研究を適用して経験を積むものです。Design Patterns book での議論は、それを大いに促進します。私はアダムの答えに投票します。

于 2013-05-09T16:59:55.563 に答える
-4

このコードで試してください:

 public static boolean isEmailValid(String email) {

    boolean isValid = false;

    String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
    CharSequence inputStr = email;

    Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(inputStr);
    if (matcher.matches()) {
        isValid = true;
    }
    return isValid;
}
于 2016-06-08T15:04:34.113 に答える