私はコマンドラインツールに取り組んでおり、ユーザー入力の量を最小限に抑えようとしていますが、機能を最大限に活用しています. リソースフォルダーに一連のデフォルト入力を用意する道を歩み始めました。これにより、ユーザー入力がまったくなくてもコードを実行できます。私は不変ライブラリを使用してこれを処理しているので、次のような型があります (ミッキー マウスの例):
@Value.Immutable
public interface Type {
String string();
Double number();
Boolean bool();
}
ユーザーがこれらの値のどれも、一部、またはすべてをオーバーライドできるようにしたい場合は、同じフィールドを持つ別の型を使用しますが、オプションでラップします。
@Value.Immutable
public interface OptionalType {
Optional<String> string();
Optional<Double> number();
Optional<Boolean> bool();
}
2 つの型をマージする場合、オプションの型をフィールドごとにチェックし、オプションではない型を再構築するメソッドがあります。
public Type MergeType(Type type, OptionalType optionalType) {
ImmutableType.Builder builder = ImmutableType.builder().from(type);
if (optionalType.string().isPresent()){
builder.string(optionalType.string().orElseThrow());
}
if (optionalType.number().isPresent()){
builder.number(optionalType.number().orElseThrow());
}
if (optionalType.bool().isPresent()){
builder.bool(optionalType.bool().orElseThrow());
}
return builder.build();
}
これはすべて正常に機能しますが、定型コードが多く、別の方法をとったほうがよいのではないかと考えています。10 個以上の型に 10 個以上のフィールドがあると、かなり面倒になります。リフレクションの使用を検討しましたが、それは通常、私がある種のパターンであることを意味するため、常に少しうんざりしています.