我有一个像这样的Java类(通过龙目岛获取/设置):
public class Foo
{
@Getter
@Setter
private byte[] byte1;
@Getter
@Setter
private String byte1String;
@Getter
@Setter
private String byte1Value;
@Getter
@Setter
private byte[] byte2;
@Getter
@Setter
private String byte2String;
@Getter
@Setter
private String byte2Value;
}
以及以下帮助方法填充Foo
对象的值:
private static final String DEFAULT_BYTE_VALUE = "someDefaultValue";
private Foo getWithBytesAndValues(Foo foo)
{
if (foo.getByte1String() != null)
{
foo.setByte1(new Base64(foo.getByte1String()).decode());
if (foo.getByte1Value() == null)
{
foo.setByte1Value(DEFAULT_BYTE_VALUE);
}
}
if (foo.getByte2String() != null)
{
foo.setByte2(new Base64(foo.getByte2String()).decode());
if (foo.getByte2Value() == null)
{
foo.setByte2Value(DEFAULT_BYTE_VALUE);
}
}
return foo;
}
我的帮助器方法看起来很混乱。.而且似乎我将相同的代码复制了两次。有什么方法可以简化这种方法吗?
答案 0 :(得分:0)
每个人都原谅我。 JB Nizet的建议好很多,但我想看看我能做什么。
public static void touch(
final Consumer<byte[]> setByte,
final Consumer<? super String> setByteValue,
final Supplier<String> byteString,
final Supplier<String> byteValue) {
if (byteString != null) {
setByte.accept(Base64.getDecoder().decode(byteString.get()));
}
if (byteValue.get() == null) {
setByteValue.accept(DEFAULT_BYTE_VALUE);
}
}
touch(
foo::setByte1,
foo::setByte1Value,
foo::getByte1String,
foo::getByte1Value
);
touch(
foo::setByte2,
foo::setByte2Value,
foo::getByte2String,
foo::getByte2Value
);
答案 1 :(得分:0)
在Foo类中,您可以在类上放置@Getter和@Setter注释以避免重复(请注意,如果在该类上添加了不能公开的其他私有属性,则应删除@Getter注释以免公开private属性):
@Getter
@Setter
public class Foo
关于方法getWithBytesAndValues,我建议您将此方法放在Foo类中,因为该方法可以使Foo attrs上得到并设置另一个Foo attrs(业务规则来自域Foo-请参阅域驱动设计)。您还可以通过两种方法将内部逻辑分开:
public class Foo {
...
public void setBytes()
setByte1();
setByte2();
}
private void setByte2() {
if (getByte2String() != null) {
setByte2(new Base64(getByte2String()).decode());
if (getByte2Value() == null) {
setByte2Value(DEFAULT_BYTE_VALUE);
}
}
}
private void setByte1() {
if (getByte1String() != null) {
setByte1(new Base64(getByte1String()).decode());
if (getByte1Value() == null) {
setByte1Value(DEFAULT_BYTE_VALUE);
}
}
}
}