如何在Java类的此辅助方法中避免代码重复?

时间:2019-03-18 17:55:59

标签: java

我有一个像这样的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;
}

我的帮助器方法看起来很混乱。.而且似乎我将相同的代码复制了两次。有什么方法可以简化这种方法吗?

2 个答案:

答案 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);
            }
        }
    }
}