Os atributos; data, valor e pagoEmDinheiro estão como atributos opcionais. E os atributos obrigatórios são; tipo e funcionario.
public class ImportadorDeGastos {
SimpleDateFormat df = new SimpleDateFormat("ddMMyyyy");
public List<Gasto> importa(InputStream entrada) throws ParseException {
Scanner leitor = new Scanner(entrada);
List<Gasto> gastos = new ArrayList<Gasto>();
while (leitor.hasNextLine()) {
String line = leitor.nextLine();
String tipo = line.substring(0, 6);
String dataGastoTxt = line.substring(6, 14);
String valorGastoTxt = line.substring(14, 23);
String matriculaFuncionarioTxt = line.substring(23, 26);
String nomeFuncionario = line.substring(26, 56);
String dataNascTxt = line.substring(56);
int matriculaFuncionario = Integer.parseInt(matriculaFuncionarioTxt);
Calendar dataNascimento = converteData(dataNascTxt);
Funcionario funcionario = new Funcionario(nomeFuncionario, matriculaFuncionario, dataNascimento);
gastos.add(new Gasto.GastoBuilder(tipo, funcionario).
comData(dataGastoTxt).
comValor(valorGastoTxt).
comPagamentoEmDinheiro(true).
builder());
}
return gastos;
}
private Calendar converteData(String dataNascTxt) throws ParseException {
Calendar dataNascimento = Calendar.getInstance();
dataNascimento.setTime(df.parse(dataNascTxt));
return dataNascimento;
}
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class Gasto {
private double valor;
private String tipo;
private Funcionario funcionario;
private boolean pagoEmDinheiro;
private Calendar data;
public Gasto(GastoBuilder builder) {
this.valor = builder.getValor();
this.tipo = builder.getTipo();
this.funcionario = builder.getFuncionario();
this.pagoEmDinheiro = builder.isPagoEmDinheiro();
this.data = builder.getData();
}
public double getValor() {
return valor;
}
public String getTipo() {
return tipo;
}
public Funcionario getFuncionario() {
return funcionario;
}
public boolean isPagoEmDinheiro() {
return pagoEmDinheiro;
}
public Calendar getData() {
return data;
}
@Override
public String toString() {
return "Gasto: " + this.valor + " por " + funcionario.getNome();
}
// Classe Builder
public static class GastoBuilder {
private SimpleDateFormat df = new SimpleDateFormat("ddMMyyyy");
private double valor;
private String tipo;
private Funcionario funcionario;
private boolean pagoEmDinheiro;
private Calendar data;
public double getValor() {
return valor;
}
public String getTipo() {
return tipo;
}
public Funcionario getFuncionario() {
return funcionario;
}
public boolean isPagoEmDinheiro() {
return pagoEmDinheiro;
}
public Calendar getData() {
return data;
}
public GastoBuilder(String tipo, Funcionario funcionario) {
this.tipo = tipo;
this.funcionario = funcionario;
}
public GastoBuilder comData(String dataTxt) {
Calendar dataNascimento = Calendar.getInstance();
try {
dataNascimento.setTime(df.parse(dataTxt));
this.data = dataNascimento;
} catch (ParseException e) {
e.printStackTrace();
}
return this;
}
public GastoBuilder comValor(String valorTxt) {
this.valor = Double.parseDouble(valorTxt);
return this;
}
public GastoBuilder comPagamentoEmDinheiro(boolean emDinheiro){
this.pagoEmDinheiro = emDinheiro;
return this;
}
public Gasto builder() {
return new Gasto(this);
}
}
}