BAEL-1706 - optional parameters in java (#4050)

* BAEL-1706 - optional parameters in java

* minor adjustments per review

* add tests
* fix formatting
* fix constructor issue with MultiVitaminOverloading

* BAEL-1706 Test name change, formatting
This commit is contained in:
chrisoberle 2018-04-22 17:55:00 -04:00 committed by Predrag Maric
parent 80f8fee3c2
commit 57a4f160aa
6 changed files with 369 additions and 0 deletions

View File

@ -0,0 +1,50 @@
package com.baeldung.optionalparams;
public class MultiVitamin {
private String name; // required
private int vitaminA; // in mcg
private int vitaminC; // in mg
private int calcium; // in mg
private int iron; // in mg
public MultiVitamin(String name) {
this.name = name;
}
public String getName() {
return name;
}
public int getVitaminA() {
return vitaminA;
}
public void setVitaminA(int vitaminA) {
this.vitaminA = vitaminA;
}
public int getVitaminC() {
return vitaminC;
}
public void setVitaminC(int vitaminC) {
this.vitaminC = vitaminC;
}
public int getCalcium() {
return calcium;
}
public void setCalcium(int calcium) {
this.calcium = calcium;
}
public int getIron() {
return iron;
}
public void setIron(int iron) {
this.iron = iron;
}
}

View File

@ -0,0 +1,38 @@
package com.baeldung.optionalparams;
public class MultiVitaminAllowingNulls {
private String name; // required
private Integer vitaminA; // in mcg
private Integer vitaminC; // in mg
private Integer calcium; // in mg
private Integer iron; // in mg
public MultiVitaminAllowingNulls(String name, Integer vitaminA, Integer vitaminC, Integer calcium, Integer iron) {
this.name = name;
this.vitaminA = vitaminA;
this.vitaminC = vitaminC;
this.calcium = calcium;
this.iron = iron;
}
public String getName() {
return name;
}
public Integer getVitaminA() {
return vitaminA;
}
public Integer getVitaminC() {
return vitaminC;
}
public Integer getCalcium() {
return calcium;
}
public Integer getIron() {
return iron;
}
}

View File

@ -0,0 +1,56 @@
package com.baeldung.optionalparams;
public class MultiVitaminOverloading {
static final int DEFAULT_IRON_AMOUNT = 20;
private final String name; // required
private final int vitaminA; // in mcg
private final int vitaminC; // in mg
private final int calcium; // in mg
private final int iron; // in mg
public MultiVitaminOverloading(String name) {
this(name, 0);
}
public MultiVitaminOverloading(String name, int vitaminA) {
this(name, vitaminA, 0);
}
public MultiVitaminOverloading(String name, int vitaminA, int vitaminC) {
this(name, vitaminA, vitaminC, 0);
}
public MultiVitaminOverloading(String name, int vitaminA, int vitaminC, int calcium) {
this(name, vitaminA, vitaminC, calcium, DEFAULT_IRON_AMOUNT);
}
public MultiVitaminOverloading(String name, int vitaminA, int vitaminC, int calcium, int iron) {
this.name = name;
this.vitaminA = vitaminA;
this.vitaminC = vitaminC;
this.calcium = calcium;
this.iron = iron;
}
public String getName() {
return name;
}
public int getVitaminA() {
return vitaminA;
}
public int getVitaminC() {
return vitaminC;
}
public int getCalcium() {
return calcium;
}
public int getIron() {
return iron;
}
}

View File

@ -0,0 +1,52 @@
package com.baeldung.optionalparams;
public class MultiVitaminStaticFactoryMethods {
static final int IRON_AMT_DEF = 20;
static final int IRON_AMT_MEN = 30;
static final int CALCIUM_AMT_DEF = 100;
static final int CALCIUM_AMT_WOMEN = 120;
private final String name; // required
private final int vitaminA; // in mcg
private final int vitaminC; // in mg
private final int calcium; // in mg
private final int iron; // in mg
public static MultiVitaminStaticFactoryMethods forMen(String name) {
return new MultiVitaminStaticFactoryMethods(name, 5000, 60, CALCIUM_AMT_DEF, IRON_AMT_MEN);
}
public static MultiVitaminStaticFactoryMethods forWomen(String name) {
return new MultiVitaminStaticFactoryMethods(name, 5000, 60, CALCIUM_AMT_WOMEN, IRON_AMT_DEF);
}
private MultiVitaminStaticFactoryMethods(String name, int vitaminA, int vitaminC, int calcium, int iron) {
this.name = name;
this.vitaminA = vitaminA;
this.vitaminC = vitaminC;
this.calcium = calcium;
this.iron = iron;
}
public String getName() {
return name;
}
public int getVitaminA() {
return vitaminA;
}
public int getVitaminC() {
return vitaminC;
}
public int getCalcium() {
return calcium;
}
public int getIron() {
return iron;
}
}

View File

@ -0,0 +1,77 @@
package com.baeldung.optionalparams;
public class MultiVitaminWithBuilder {
private final String name; // required
private final int vitaminA; // in mcg
private final int vitaminC; // in mg
private final int calcium; // in mg
private final int iron; // in mg
private MultiVitaminWithBuilder(MultiVitaminBuilder builder) {
this.name = builder.name;
this.vitaminA = builder.vitaminA;
this.vitaminC = builder.vitaminC;
this.calcium = builder.calcium;
this.iron = builder.iron;
}
public String getName() {
return name;
}
public int getVitaminA() {
return vitaminA;
}
public int getVitaminC() {
return vitaminC;
}
public int getCalcium() {
return calcium;
}
public int getIron() {
return iron;
}
public static class MultiVitaminBuilder {
private static final int ZERO = 0;
private final String name; // required
private int vitaminA = ZERO;
private int vitaminC = ZERO;
private int calcium = ZERO;
private int iron = ZERO;
public MultiVitaminBuilder(String name) {
this.name = name;
}
public MultiVitaminBuilder withVitaminA(int vitaminA) {
this.vitaminA = vitaminA;
return this;
}
public MultiVitaminBuilder withVitaminC(int vitaminC) {
this.vitaminC = vitaminC;
return this;
}
public MultiVitaminBuilder withCalcium(int calcium) {
this.calcium = calcium;
return this;
}
public MultiVitaminBuilder withIron(int iron) {
this.iron = iron;
return this;
}
public MultiVitaminWithBuilder build() {
return new MultiVitaminWithBuilder(this);
}
}
}

View File

@ -0,0 +1,96 @@
package com.baeldung.optionalparams;
import static org.assertj.core.api.Assertions.assertThat;
import java.math.BigDecimal;
import org.assertj.core.util.Arrays;
import org.junit.Test;
public class OptionalParamsUnitTest {
@Test
public void whenCreateMultiVitaminWithOverloading_thenOk() {
MultiVitaminOverloading multiVitamin = new MultiVitaminOverloading("Default Multivitamin");
assertThat(multiVitamin.getName()).isEqualTo("Default Multivitamin");
assertThat(multiVitamin.getVitaminA()).isEqualTo(0);
assertThat(multiVitamin.getVitaminC()).isEqualTo(0);
assertThat(multiVitamin.getCalcium()).isEqualTo(0);
assertThat(multiVitamin.getIron()).isEqualTo(MultiVitaminOverloading.DEFAULT_IRON_AMOUNT);
}
@Test
public void whenCreateMultiVitaminWithStaticFactoryMethods_thenOk() {
MultiVitaminStaticFactoryMethods mensMultiVitamin = MultiVitaminStaticFactoryMethods.forMen("Complete for Men");
assertThat(mensMultiVitamin.getName()).isEqualTo("Complete for Men");
assertThat(mensMultiVitamin.getCalcium()).isEqualTo(MultiVitaminStaticFactoryMethods.CALCIUM_AMT_DEF);
assertThat(mensMultiVitamin.getIron()).isEqualTo(MultiVitaminStaticFactoryMethods.IRON_AMT_MEN);
MultiVitaminStaticFactoryMethods womensMultiVitamin = MultiVitaminStaticFactoryMethods.forWomen("Complete for Women");
assertThat(womensMultiVitamin.getName()).isEqualTo("Complete for Women");
assertThat(womensMultiVitamin.getCalcium()).isEqualTo(MultiVitaminStaticFactoryMethods.CALCIUM_AMT_WOMEN);
assertThat(womensMultiVitamin.getIron()).isEqualTo(MultiVitaminStaticFactoryMethods.IRON_AMT_DEF);
}
@Test
public void whenCreateMultiVitaminWithBuilder_thenOk() {
MultiVitaminWithBuilder vitamin = new MultiVitaminWithBuilder.MultiVitaminBuilder("Maximum Strength")
.withCalcium(100)
.withIron(200)
.withVitaminA(50)
.withVitaminC(1000)
.build();
assertThat(vitamin.getName()).isEqualTo("Maximum Strength");
assertThat(vitamin.getCalcium()).isEqualTo(100);
assertThat(vitamin.getIron()).isEqualTo(200);
assertThat(vitamin.getVitaminA()).isEqualTo(50);
assertThat(vitamin.getVitaminC()).isEqualTo(1000);
}
@Test
public void whenCreateMutliVitaminWithAccessors_thenOk() {
MultiVitamin vitamin = new MultiVitamin("Generic");
vitamin.setVitaminA(50);
vitamin.setVitaminC(1000);
vitamin.setCalcium(100);
vitamin.setIron(200);
assertThat(vitamin.getName()).isEqualTo("Generic");
assertThat(vitamin.getCalcium()).isEqualTo(100);
assertThat(vitamin.getIron()).isEqualTo(200);
assertThat(vitamin.getVitaminA()).isEqualTo(50);
assertThat(vitamin.getVitaminC()).isEqualTo(1000);
}
@Test
public void whenCreateMultiVitaminWithNulls_thenOk() {
MultiVitamin vitamin = new MultiVitamin(null);
assertThat(vitamin.getName()).isNull();
}
public void varArgsDemo() {
Object[] args = Arrays.array(Long.valueOf(1), Integer.valueOf(2), BigDecimal.valueOf(3));
processVarArgsWithCastingAntiPattern(args);
}
private void processVarArgsWithCastingAntiPattern(Object... args) {
String message = "processing %s as %s";
// never do this sort of thing
for (Object arg : args) {
if (arg instanceof Long) {
System.out.println(String.format(message, arg, "Long"));
} else if (arg instanceof Integer) {
System.out.println(String.format(message, arg, "Integer"));
} else if (arg instanceof BigDecimal) {
System.out.println(String.format(message, arg, "BigDecimal"));
}
}
}
}