OrderItem.java

 avatar
Jpro1124
plain_text
10 months ago
3.2 kB
19
Indexable
import java.util.ArrayList;
import java.util.List;

/**
 * OrderItem class represents a single food item in an order
 * This is the product class that will be built by OrderItemBuilder
 */
public class OrderItem {
    private String name;
    private double price;
    private int quantity;
    private String size;
    private List<String> extras;
    
    // Private constructor to force use of builder
    private OrderItem() {
        this.extras = new ArrayList<>();
    }
    
    // Getters
    public String getName() {
        return name;
    }
    
    public double getPrice() {
        return price;
    }
    
    public int getQuantity() {
        return quantity;
    }
    
    public String getSize() {
        return size;
    }
    
    public List<String> getExtras() {
        return new ArrayList<>(extras); // Return copy to maintain encapsulation
    }
    
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(quantity).append("x ").append(name);
        if (size != null && !size.isEmpty()) {
            sb.append(" (").append(size).append(")");
        }
        if (!extras.isEmpty()) {
            sb.append(" with ").append(String.join(", ", extras));
        }
        sb.append(" - $").append(String.format("%.2f", price * quantity));
        return sb.toString();
    }
    
    /**
     * Builder class for OrderItem
     * Implements the Builder pattern for constructing OrderItem objects
     */
    public static class OrderItemBuilder {
        private OrderItem item;
        
        public OrderItemBuilder() {
            this.item = new OrderItem();
        }
        
        public OrderItemBuilder setName(String name) {
            item.name = name;
            return this;
        }
        
        public OrderItemBuilder setPrice(double price) {
            item.price = price;
            return this;
        }
        
        public OrderItemBuilder setQuantity(int quantity) {
            if (quantity <= 0) {
                throw new IllegalArgumentException("Quantity must be positive");
            }
            item.quantity = quantity;
            return this;
        }
        
        public OrderItemBuilder setSize(String size) {
            item.size = size;
            return this;
        }
        
        public OrderItemBuilder addExtra(String extra) {
            if (extra != null && !extra.trim().isEmpty()) {
                item.extras.add(extra);
            }
            return this;
        }
        
        public OrderItem build() {
            // Validation
            if (item.name == null || item.name.trim().isEmpty()) {
                throw new IllegalStateException("Item name is required");
            }
            if (item.price < 0) {
                throw new IllegalStateException("Price cannot be negative");
            }
            if (item.quantity <= 0) {
                throw new IllegalStateException("Quantity must be positive");
            }
            
            return item;
        }
    }
}
Editor is loading...
Leave a Comment