Java Java Objects Delivering the MVP Applying a Discount Code

Jonathan Hartmayer
Jonathan Hartmayer
907 Points

Letters validation: better solution?

Did anyone get a cleaner or simpler solution than the following:

Order.java
public class Order {
  private String itemName;
  private int priceInCents;
  private String discountCode;

  public Order(String itemName, int priceInCents) {
    this.itemName = itemName;
    this.priceInCents = priceInCents;
  }

  public String getItemName() {
    return itemName;
  }

  public int getPriceInCents() {
    return priceInCents;
  }

  public String getDiscountCode() {
    return discountCode;
  }

 private String normalizeDiscountCode(String discountCode) { 
    for (int i = 0; i < discountCode.length(); i++) { 
        if (!Character.isLetter(discountCode.charAt(i))) { 
            if (discountCode.charAt(i) != '$') { 
                throw new IllegalArgumentException("Invalid discount code"); 
            } 
        } 
    } return discountCode.toUpperCase(); 
}

  public void applyDiscountCode(String discountCode) {
    this.discountCode = normalizeDiscountCode(discountCode);
  }
}
Example.java
public class Example {

  public static void main(String[] args) {
    // This is here just for example use cases.

    Order order = new Order(
            "Yoda PEZ Dispenser",
            600);

    // These are valid.  They are letters and the $ character only
    order.applyDiscountCode("abc");
    order.getDiscountCode(); // ABC

    order.applyDiscountCode("$ale");
    order.getDiscountCode(); // $ALE


    try {
      // This will throw an exception because it contains numbers
      order.applyDiscountCode("ABC123");
    } catch (IllegalArgumentException iae) {
      System.out.println(iae.getMessage());  // Prints "Invalid discount code"
    }
    try {
      // This will throw as well, because it contains a symbol.
      order.applyDiscountCode("w@w");
    }catch (IllegalArgumentException iae) {
      System.out.println(iae.getMessage());  // Prints "Invalid discount code"
    }

  }
}

2 Answers

Rares Conea
PRO
Rares Conea
Pro Student 6,250 Points

private String normalizeDiscountCode(String discountCode){ for(int i = 0 ; i < discountCode.length(); i++){ if(!(Character.isLetter(discountCode.charAt(i)) || discountCode.charAt(i) == '$')){ throw new IllegalArgumentException("Invalid discount code"); } } return discountCode.toUpperCase(); }

Jonathan Hartmayer
Jonathan Hartmayer
907 Points

Thanks for the response. Yes, that works too. I guess my question was if there was a solution that didn't require a for loop?

Rares Conea
PRO
Rares Conea
Pro Student 6,250 Points

You can use lambdas: https://i.imgur.com/mU2FQJD.png

To make this work make sure you add these lines: import java.util.List; import java.util.stream.Collectors;