Skip to main content

Overview

This page provides a comprehensive reference for all classes, methods, and code structures in the Currency Converter application.

ConversorApp (Main Controller)

Package: lad.com.alura.conversormoneda.controladores Purpose: Application entry point and main controller that orchestrates the conversion flow.

Class Structure

package lad.com.alura.conversormoneda.controladores;

import lad.com.alura.conversormoneda.modelos.ConsultaMoneda;
import lad.com.alura.conversormoneda.vista.Conversor;
import lad.com.alura.conversormoneda.modelos.RegistroConversion;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ConversorApp {
    public static void main(String[] args) {
        // Implementation
    }
}

main() Method

args
String[]
Command-line arguments (not used in current implementation)
returns
void
No return value

Complete Implementation

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // Instantiate service (OOP)
    ConsultaMoneda consulta = new ConsultaMoneda();
    // Create history list
    List<RegistroConversion> historial = new ArrayList<>();

    int opcion;

    while (true) {
        // Display menu
        Conversor.eleccionUserMenu();
        opcion = sc.nextInt();

        if (opcion == 8) {
            System.out.println("Gracias por usar el conversor.");
            break;
        }

        if (opcion == 7) {
            // Display history
            System.out.println("\n--- HISTORIAL DE CONVERSIONES ---");
            if (historial.isEmpty()) {
                System.out.println("No hay conversiones recientes.");
            } else {
                historial.forEach(System.out::println); // Lambda!
            }
            System.out.println("---------------------------------\n");
            continue;
        }

        if (opcion >= 1 && opcion <= 6) {
            // Process conversion...
        } else {
            System.out.println("Opción no válida. Intente de nuevo.\n");
        }
    }
    sc.close();
}

Key Features

Menu Options

  • Options 1-6: Currency conversions
  • Option 7: View history
  • Option 8: Exit application

Data Structures

  • Scanner for user input
  • ConsultaMoneda service instance
  • List<RegistroConversion> for history

Switch Expressions

Uses Java 14+ switch expressions with yield for cleaner code

Lambda Functions

Uses method reference System.out::println for history display

ConsultaMoneda (Service Class)

Package: lad.com.alura.conversormoneda.modelos Purpose: Service class responsible for communicating with ExchangeRate-API.

Class Definition

package lad.com.alura.conversormoneda.modelos;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ConsultaMoneda {
    // Instance method (not static)
    public double obtenerTasa(String monedaBase, 
                             String monedaObjetivo, 
                             double cantidad) {
        // Implementation
    }
}

obtenerTasa() Method Signature

monedaBase
String
required
Source currency code (e.g., “USD”, “ARS”, “BRL”)
monedaObjetivo
String
required
Target currency code (e.g., “ARS”, “BRL”, “COP”)
cantidad
double
required
Amount to convert
returns
double
Converted amount, or 0 if error occurs

Method Implementation Breakdown

1

Create HTTP Client

HttpClient cliente = HttpClient.newHttpClient();
Creates a new HTTP client for making requests
2

Build API URL

String url = "https://v6.exchangerate-api.com/v6/9ba310889b4d07769a662fc0/pair/" 
    + monedaBase + "/" + monedaObjetivo + "/" + cantidad;
Constructs the API endpoint with currency codes and amount
3

Create HTTP Request

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(url))
        .GET()
        .build();
Builds an HTTP GET request
4

Send Request

HttpResponse<String> respuesta = cliente.send(
    request, 
    HttpResponse.BodyHandlers.ofString()
);
Sends the request and receives response as String
5

Parse JSON

JsonElement elemento = JsonParser.parseString(respuesta.body());
JsonObject objectRoot = elemento.getAsJsonObject();
Parses JSON response into JsonObject
6

Extract Result

return objectRoot.get("conversion_result").getAsDouble();
Extracts and returns the conversion result
7

Handle Errors

catch (Exception e) {
    System.out.println("Error al conectar con la API: " + e.getMessage());
    return 0;
}
Catches all exceptions and returns 0

Usage Example

// Create service instance
ConsultaMoneda consulta = new ConsultaMoneda();

// Perform conversion
double resultado = consulta.obtenerTasa("USD", "ARS", 100.0);

// Display result
System.out.println("100 USD = " + resultado + " ARS");
The method is not static, following OOP principles. You must create an instance of ConsultaMoneda to use it.

RegistroConversion (Data Record)

Package: lad.com.alura.conversormoneda.modelos Purpose: Immutable data structure to store conversion history entries.

Record Definition

package lad.com.alura.conversormoneda.modelos;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public record RegistroConversion(
    String monedaBase, 
    String monedaObjetivo, 
    double cantidad, 
    double resultado, 
    LocalDateTime fechaHora
) {
    @Override
    public String toString() {
        DateTimeFormatter formato = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
        return "[" + fechaHora.format(formato) + "] " 
            + cantidad + " " + monedaBase + " =>> " 
            + resultado + " " + monedaObjetivo;
    }
}

Record Components

monedaBase
String
The base (source) currency code
monedaObjetivo
String
The target (destination) currency code
cantidad
double
The original amount in base currency
resultado
double
The converted amount in target currency
fechaHora
LocalDateTime
Timestamp when the conversion was performed

Java Records (Java 14+)

What are Records?

Records are a special kind of class introduced in Java 14 that provide:
  • Automatic constructor
  • Automatic getters (component methods)
  • Automatic equals() and hashCode()
  • Automatic toString() (can be overridden)
  • Immutability by default

Automatically Generated Methods

// Automatically generated canonical constructor
public RegistroConversion(
    String monedaBase,
    String monedaObjetivo,
    double cantidad,
    double resultado,
    LocalDateTime fechaHora
) {
    // Fields are automatically assigned
}

Custom toString() Implementation

The record overrides toString() to provide formatted output:
@Override
public String toString() {
    DateTimeFormatter formato = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
    return "[" + fechaHora.format(formato) + "] " 
        + cantidad + " " + monedaBase + " =>> " 
        + resultado + " " + monedaObjetivo;
}
Example Output:
[05-03-2026 14:30:45] 100.0 USD =>> 6323.41 ARS

Usage Examples

// Create a new conversion record
RegistroConversion registro = new RegistroConversion(
    "USD",              // monedaBase
    "ARS",              // monedaObjetivo
    100.0,              // cantidad
    6323.41,            // resultado
    LocalDateTime.now() // fechaHora
);

Conversor (View Class)

Package: lad.com.alura.conversormoneda.vista Purpose: Handles user interface display and presentation logic.

Class Structure

package lad.com.alura.conversormoneda.vista;

public class Conversor {
    public static void eleccionUserMenu() {
        System.out.print("""
                Sea bienvenido/a al Conversor de Moneda =]
                
                ==================================================
                1) Dólar           =>> Peso argentino
                2) Peso argentino  =>> Dólar
                3) Dólar           =>> Real brasileño
                4) Real brasileño  =>> Dólar
                5) Dólar           =>> Peso colombiano
                6) Peso colombiano =>> Dólar
                7) Historial de conversiones
                8) Salir
                ==================================================
                Elija una opción válida:
                """);
    }
}

eleccionUserMenu() Method

parameters
none
No parameters required
returns
void
No return value (displays menu to console)
access
public static
Static method - can be called without creating an instance

Text Blocks (Java 13+)

The method uses text blocks for multi-line string literals:
System.out.print("""
    Multi-line
    String
    Content
    """);
Benefits:No need for \n newline characters, no need for string concatenation, preserves formatting and indentation, and more readable for large text blocks.

Option 1

USD → ARS (Dollar to Argentine Peso)

Option 2

ARS → USD (Argentine Peso to Dollar)

Option 3

USD → BRL (Dollar to Brazilian Real)

Option 4

BRL → USD (Brazilian Real to Dollar)

Option 5

USD → COP (Dollar to Colombian Peso)

Option 6

COP → USD (Colombian Peso to Dollar)

Option 7

Display conversion history

Option 8

Exit the application

Usage

// Call from controller
Conversor.eleccionUserMenu();

// User sees the menu and enters their choice
int opcion = scanner.nextInt();
The method uses System.out.print() (not println()) so the cursor remains on the same line as the prompt, providing a better user experience.

Method Signatures Summary

ConversorApp.main()

public static void main(String[] args)
Application entry point - orchestrates the entire conversion flow

ConsultaMoneda.obtenerTasa()

public double obtenerTasa(String monedaBase, String monedaObjetivo, double cantidad)
Performs API request and returns converted amount

RegistroConversion (Constructor)

public RegistroConversion(String monedaBase, String monedaObjetivo, 
                         double cantidad, double resultado, 
                         LocalDateTime fechaHora)
Creates immutable conversion history record

RegistroConversion.toString()

public String toString()
Returns formatted string representation of the conversion

Conversor.eleccionUserMenu()

public static void eleccionUserMenu()
Displays the main menu to the user

Modern Java Features Used

Used in RegistroConversion for immutable data carriers:
public record RegistroConversion(
    String monedaBase,
    String monedaObjetivo,
    double cantidad,
    double resultado,
    LocalDateTime fechaHora
) { }
Used in Conversor.eleccionUserMenu() for multi-line strings:
System.out.print("""
    Multi-line
    String
    """);
Used in ConversorApp.main() for currency selection:
objetivo = switch (opcion) {
    case 1 -> {
        base = "USD";
        yield "ARS";
    }
    // ...
};
Used for history display:
historial.forEach(System.out::println);
Modern HTTP client API:
HttpClient cliente = HttpClient.newHttpClient();
HttpResponse<String> respuesta = cliente.send(request, 
    HttpResponse.BodyHandlers.ofString());
While not used in this codebase, could simplify local variable declarations:
var consulta = new ConsultaMoneda();
var historial = new ArrayList<RegistroConversion>();
Java Version Requirement: This application requires Java 14 or higher due to the use of records and switch expressions with yield.

Dependencies

  • java.net.http.HttpClient - HTTP communication
  • java.net.URI - URL handling
  • java.time.LocalDateTime - Timestamp management
  • java.time.format.DateTimeFormatter - Date formatting
  • java.util.Scanner - User input
  • java.util.ArrayList - Dynamic list storage
  • java.util.List - List interface

Build docs developers (and LLMs) love