1

不特定多数のオブジェクトを作成する必要があるため、それを行うビルダーを作成しようとしました。私のビルダーが同じ値を持つプロパティを持つすべてのオブジェクトを作成することに気付くまで、すべては順調でした。

したがって、ビルダーを呼び出すと、次のようになります。

ValidationHelper v = new ValidationHelper.HelperBuilder()
        .addHelper("ICAO Identifier", icaoIdentifier, rulesICAO)
        .addHelper("Long Name", longName, rulesLongName)
        .build();

... 2 つのオブジェクトがあり、それらのプロパティには、ビルダーが作成を要求された最後のオブジェクトの値が含まれます。

そもそも、工場ビルダーはこれに対する賢明なアプローチですか? 第二に、ビルダーは回収可能ですか?

ビルダー:

public class ValidationHelper {

    private static ArrayList<HelperBuilder> validatorHelpers = new ArrayList();


    public static class HelperBuilder {

        private String txtFieldName;
        private String txtFieldValue;

        private List<Integer> valCodes = new ArrayList<Integer>();

        private ArrayList<HelperBuilder> innerValidatorHelpers = new ArrayList<HelperBuilder>();

        public HelperBuilder() {}

        public final HelperBuilder addHelper(String txtFieldName, String txtFieldValue, int[] validationCodes) {

            this.txtFieldName = txtFieldName;
            this.txtFieldValue = txtFieldValue;
            for( int i = 0; i < validationCodes.length; i++ ){
                getValCodes().add((Integer) validationCodes[i]);
            }

            innerValidatorHelpers.add(this);
            return this;
        }

        public final ValidationHelper build() {
            return new ValidationHelper(this);
        }

        public String getTxtFieldName() {
            return txtFieldName;
        }

        public String getTxtFieldValue() {
            return txtFieldValue;
        }

        public List<Integer> getValCodes() {
            return valCodes;
        }
    }//end HelperBuilder

    private ValidationHelper(HelperBuilder helperBuilder) {
        validatorHelpers = helperBuilder.innerValidatorHelpers;
    }

    public void setHelpers(ArrayList validatorHelpers) {
        validatorHelpers = validatorHelpers;
    }

    public ArrayList getHelpers() {
        return validatorHelpers;
    }
}

編集/修正:

価値があるので、ここに改訂されたビルダーがあります。ビルドするはずのインスタンスを適切に初期化できる別のコンストラクターが必要でした。

public class ValidationHelper {

    private static ArrayList<HelperBuilder> validatorHelpers = new ArrayList();

    public static class HelperBuilder {

        private String txtFieldName;
        private String txtFieldValue;

        private List<Integer> valCodes = new ArrayList<Integer>();

        private ArrayList<HelperBuilder> innerValidatorHelpers = new ArrayList<HelperBuilder>();

        public HelperBuilder() {}
        public HelperBuilder(String txtFieldName, String txtFieldValue, int[] validationCodes) {

            this.txtFieldName = txtFieldName;
            this.txtFieldValue = txtFieldValue;

            for (int i = 0; i < validationCodes.length; i++) {
                valCodes.add((Integer) validationCodes[i]);
            }

        }

        public final HelperBuilder addHelper(String txtFieldName, String txtFieldValue, int[] validationCodes) {
            innerValidatorHelpers.add( new HelperBuilder(txtFieldName, txtFieldValue, validationCodes) );
            return this;
        }

        public final ValidationHelper build() {
            return new ValidationHelper(this);
        }

        public String getTxtFieldName() {
            return txtFieldName;
        }

        public String getTxtFieldValue() {
            return txtFieldValue;
        }

        public List getValCodes() {
            return valCodes;
        }
    }//end HelperBuilder

    private ValidationHelper(HelperBuilder helperBuilder) {
        validatorHelpers = helperBuilder.innerValidatorHelpers;
    }

    public ArrayList getHelpers() {
        return validatorHelpers;
    }
}
4

2 に答える 2

2

の値を上書きするたびに

private String txtFieldName;
private String txtFieldValue;

そして最後のものが勝ちます。したがって、ここで作成するHelperInstanceは1つだけです。

ValidationHelper v = new ValidationHelper.HelperBuilder()

また、フィールドの名前と値は、addHelper()を呼び出すたびに上書きされます。ただし、「構成」ごとにインスタンスを作成する必要があります。したがって、addHelperは新しいインスタンスを作成し、それをに追加する必要があります

private ArrayList<HelperBuilder> innerValidatorHelpers = ...;
于 2012-08-13T10:39:13.967 に答える
2

異なる値でオブジェクトを作成する場合は、次のいずれかを行う必要があります。

  • オブジェクトを作成する間にビルダーを変更して、別の何かをビルドするようにします。
  • 値を自動的に変更するようにビルダーに指示します。たとえば、日付に基づいてカウンターまたはファイル名を使用するか、値のリストを提供します。
于 2012-08-13T10:39:16.443 に答える