/* * This is free and unencumbered software released into the public domain. * * Anyone is free to copy, modify, publish, use, compile, sell, or * distribute this software, either in source code form or as a compiled * binary, for any purpose, commercial or non-commercial, and by any * means. * * In jurisdictions that recognize copyright laws, the author or authors * of this software dedicate any and all copyright interest in the * software to the public domain. We make this dedication for the benefit * of the public at large and to the detriment of our heirs and * successors. We intend this dedication to be an overt act of * relinquishment in perpetuity of all present and future rights to this * software under copyright law. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * For more information, please refer to <http://unlicense.org/> */ package jxtn.jfx.makers; import java.util.ArrayList; import java.util.Map; import java.util.Objects; import java.util.TreeMap; import java.util.function.Consumer; /** * 基底建構器。 * * @author AqD * @param <Z> 要建構的物件型態 * @param <B> 建構器本身的型態 */ public class AbstractMaker<Z, B extends AbstractMaker<Z, B>> { /** * 建構後執行動作集合(具名)。 */ protected Map<String, Consumer<? super Z>> namedAfterBuildActions; /** * 建構後執行動作集合(不具名)。 */ protected ArrayList<Consumer<? super Z>> unnamedAfterBuildActions; /** * 套用建構器的屬性設定。 * * @param instance 要套用屬性的物件實體 */ public void applyTo(Z instance) { Objects.requireNonNull(instance); // } /** * 註冊物件建構後的執行動作。 * * @param action 執行動作 * @return 目前建構器(this) */ @SuppressWarnings("unchecked") public final B afterBuild(Consumer<? super Z> action) { Objects.requireNonNull(action); if (this.unnamedAfterBuildActions == null) this.unnamedAfterBuildActions = new ArrayList<>(); this.unnamedAfterBuildActions.add(action); return (B) this; } /** * 註冊物件建構後的執行動作。 * * @param name 動作名稱,名稱重複會覆蓋掉舊的 * @param action 執行動作 * @return 目前建構器(this) */ @SuppressWarnings("unchecked") public final B afterBuild(String name, Consumer<? super Z> action) { Objects.requireNonNull(action); if (this.namedAfterBuildActions == null) this.namedAfterBuildActions = new TreeMap<>(); this.namedAfterBuildActions.put(name, action); return (B) this; } /** * 建構物件。 * * @return 建構的物件 */ public Object build() { return new Object(); } /** * 呼叫建構後的執行動作({@link #unnamedAfterBuildActions})。 * * @param instance 要執行動作的目標物件 */ protected final void doAfterBuild(Z instance) { Objects.requireNonNull(instance); if (this.namedAfterBuildActions != null) { for (Consumer<? super Z> action : this.namedAfterBuildActions.values()) { action.accept(instance); } } if (this.unnamedAfterBuildActions != null) { for (Consumer<? super Z> action : this.unnamedAfterBuildActions) { action.accept(instance); } } } }