ユーザー設定のストアを作成していますが、ユーザーが値を設定できる設定の数は決まっています。プリファレンス (設定) の名前は Enum として保存されます。
public enum UserSettingName {
FOO,
BAR,
ETC
}
私ができるようにしたいのは、サービスが正しいJavaタイプでユーザーの値を保存できるように、値のタイプを名前で保存することです。たとえば、FOO は でありLong
、BAR は である可能性がありString
ます。これまでは、すべての値をString
s として格納し、その値を適切な Java 型に手動でキャストしていました。これにより、サービス内に try/catch を 1 つだけ持つ方が理にかなっている場合でも、あらゆる場所で try/catch ブロックが発生します。列挙型はジェネリック型を持つことができないことを理解しているので、次のことをいじっています。
public enum UserSettingName {
FOO(Long.class),
BAR(String.class),
ETC(Baz.class)
private Class type;
private UserSettingName(Class type) {
this.type = type;
}
public Class getType() {
return this.type;
}
}
私は、正しい型で値を返し、設定するメソッドを持つ汎用 UserSetting オブジェクトを持っていpublic T getSettingValue()
ます。私の問題は、次のようなことができないため、設定を作成または取得するときにpublic void setSettingValue(T value)
そのジェネリック型を指定しようとすることにあります。T
new UserSetting<UserSettingName.FOO.getType()>(UserSettingName.FOO, 123L)
これが明確でない場合は申し訳ありませんが、理解できない場合は明確にすることができます。
ありがとう!
アップデート
設定の名前と値の両方が、Spring MVC REST 呼び出しから取得されます。
public ResponseEntity<String> save(@PathVariable Long userId, @PathVariable UserSettingName settingName, @RequestBody String settingValue)
Spring は受信データを自動的にキャストするため、Enum を使用しました。