// 1. Extração da Classe Curso (Mantida da refatoração anterior)
class Curso {
private double mensalidade;
public Curso
( String nome,
String nivel,
double mensalidade
) { this .nome = nome;
this .nivel = nivel;
this .mensalidade = mensalidade;
}
public String getNome
( ) { return nome
; } public String getNivel
( ) { return nivel
; } public double getMensalidade( ) { return mensalidade; }
}
// 2. Criação de hierarquia para o Trabalho de Conclusão
abstract class TrabalhoConclusao {
}
// 2.1 Subclasse para o caso onde NÃO há trabalho (Null Object)
class TrabalhoNulo extends TrabalhoConclusao {
@Override
return "" ; // Não retorna nada, evitando verificações de null
}
}
// 2.2 Subclasse para o caso onde HÁ trabalho
class TrabalhoRealizado extends TrabalhoConclusao {
this .orientador = orientador;
this .titulo = titulo;
this .nota = nota;
}
@Override
switch ( nivelCurso) {
case "Graduação" : resp += "do TCC: " ; break ;
case "Lato sensu" : resp += "da monografia: " ; break ;
case "Mestrado" : resp += "da dissertação: " ; break ;
case "Doutorado" : resp += "da tese: " ; break ;
}
resp += titulo + "\n " ;
resp += "Orientador(a): Prof. " + orientador + "\n " ;
resp += "Nota: " + nota + "\n " ;
return resp;
}
}
// 3. Superclasse abstrata para Aluno
abstract class Aluno {
protected int matricula;
protected Curso curso;
protected boolean cursoFinalizado;
protected int anoFinalizacao;
protected TrabalhoConclusao trabalho;
public Aluno
( String nome,
int matricula, Curso curso,
boolean cursoFinalizado,
int anoFinalizacao, TrabalhoConclusao trabalho
) { this .nome = nome;
this .matricula = matricula;
this .curso = curso;
this .cursoFinalizado = cursoFinalizado;
this .anoFinalizacao = anoFinalizacao;
this .trabalho = trabalho;
}
public abstract String getDados
( ) ;
// Método auxiliar para evitar duplicação de código nas subclasses
protected String getDadosAcademicos
( ) { String resp
= "Aluno: " + this .
nome + "\n " ; resp += "Curso: " + this .curso .getNivel ( ) + " em " + this .curso .getNome ( ) + "\n " ;
if ( this .cursoFinalizado ) {
resp += "Curso finalizado em " + anoFinalizacao + "\n " ;
resp += trabalho.getDadosTrabalho ( curso.getNivel ( ) ) ;
}
return resp;
}
}
// 4. Subclasse para alunos sem bolsa
class AlunoRegular extends Aluno {
public AlunoRegular
( String nome,
int matricula, Curso curso,
boolean cursoFinalizado,
int anoFinalizacao, TrabalhoConclusao trabalho
) { super ( nome, matricula, curso, cursoFinalizado, anoFinalizacao, trabalho) ;
}
@Override
String resp
= getDadosAcademicos
( ) ; resp += "Mensalidade: R$ " + this .curso .getMensalidade ( ) + "\n " ;
return resp;
}
}
// 5. Subclasse para alunos bolsistas
class AlunoBolsista extends Aluno {
private double desconto;
public AlunoBolsista
( String nome,
int matricula, Curso curso,
boolean cursoFinalizado,
int anoFinalizacao, TrabalhoConclusao trabalho,
double desconto
) { super ( nome, matricula, curso, cursoFinalizado, anoFinalizacao, trabalho) ;
this .desconto = desconto;
}
@Override
String resp
= getDadosAcademicos
( ) ; resp += "Bolsista com desconto de: " + this .desconto + "%\n " ;
resp += "Mensalidade: R$ " + this .curso .getMensalidade ( ) * ( 1 - this .desconto / 100 ) + "\n " ;
return resp;
}
}
// 6. Classe de Teste
class Teste {
public static void main
( String args
[ ] ) { Curso c1 = new Curso( "ADS" , "Graduação" , 920.50 ) ;
Curso c2 = new Curso( "Computação Aplicada" , "Mestrado" , 2150.45 ) ;
// Instanciando TrabalhoNulo para o aluno 1
TrabalhoConclusao t1 = new TrabalhoNulo( ) ;
Aluno aluno1 = new AlunoBolsista( "Martin Fowler" , 11223344 , c1, false , - 1 , t1, 20.5 ) ;
// Instanciando TrabalhoRealizado para o aluno 2
TrabalhoConclusao t2 = new TrabalhoRealizado( "Peter Coad" , "Impacto da Refatoração" , "9.5" ) ;
Aluno aluno2 = new AlunoRegular( "Kent Beck" , 22334455 , c2, true , 2019 , t2) ;
System .
out .
println ( aluno1.
getDados ( ) ) ; System .
out .
println ( "-------------------" ) ; System .
out .
println ( aluno2.
getDados ( ) ) ; }
}
Ly8gMS4gRXh0cmHDp8OjbyBkYSBDbGFzc2UgQ3Vyc28gKE1hbnRpZGEgZGEgcmVmYXRvcmHDp8OjbyBhbnRlcmlvcikKY2xhc3MgQ3Vyc28gewogICAgcHJpdmF0ZSBTdHJpbmcgbm9tZTsKICAgIHByaXZhdGUgU3RyaW5nIG5pdmVsOwogICAgcHJpdmF0ZSBkb3VibGUgbWVuc2FsaWRhZGU7CgogICAgcHVibGljIEN1cnNvKFN0cmluZyBub21lLCBTdHJpbmcgbml2ZWwsIGRvdWJsZSBtZW5zYWxpZGFkZSkgewogICAgICAgIHRoaXMubm9tZSA9IG5vbWU7CiAgICAgICAgdGhpcy5uaXZlbCA9IG5pdmVsOwogICAgICAgIHRoaXMubWVuc2FsaWRhZGUgPSBtZW5zYWxpZGFkZTsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldE5vbWUoKSB7IHJldHVybiBub21lOyB9CiAgICBwdWJsaWMgU3RyaW5nIGdldE5pdmVsKCkgeyByZXR1cm4gbml2ZWw7IH0KICAgIHB1YmxpYyBkb3VibGUgZ2V0TWVuc2FsaWRhZGUoKSB7IHJldHVybiBtZW5zYWxpZGFkZTsgfQp9CgovLyAyLiBDcmlhw6fDo28gZGUgaGllcmFycXVpYSBwYXJhIG8gVHJhYmFsaG8gZGUgQ29uY2x1c8OjbyAKYWJzdHJhY3QgY2xhc3MgVHJhYmFsaG9Db25jbHVzYW8gewogICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREYWRvc1RyYWJhbGhvKFN0cmluZyBuaXZlbEN1cnNvKTsKfQoKLy8gMi4xIFN1YmNsYXNzZSBwYXJhIG8gY2FzbyBvbmRlIE7Dg08gaMOhIHRyYWJhbGhvIChOdWxsIE9iamVjdCkKY2xhc3MgVHJhYmFsaG9OdWxvIGV4dGVuZHMgVHJhYmFsaG9Db25jbHVzYW8gewogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgU3RyaW5nIGdldERhZG9zVHJhYmFsaG8oU3RyaW5nIG5pdmVsQ3Vyc28pIHsKICAgICAgICByZXR1cm4gIiI7IC8vIE7Do28gcmV0b3JuYSBuYWRhLCBldml0YW5kbyB2ZXJpZmljYcOnw7VlcyBkZSBudWxsCiAgICB9Cn0KCi8vIDIuMiBTdWJjbGFzc2UgcGFyYSBvIGNhc28gb25kZSBIw4EgdHJhYmFsaG8KY2xhc3MgVHJhYmFsaG9SZWFsaXphZG8gZXh0ZW5kcyBUcmFiYWxob0NvbmNsdXNhbyB7CiAgICBwcml2YXRlIFN0cmluZyBvcmllbnRhZG9yOwogICAgcHJpdmF0ZSBTdHJpbmcgdGl0dWxvOwogICAgcHJpdmF0ZSBTdHJpbmcgbm90YTsKCiAgICBwdWJsaWMgVHJhYmFsaG9SZWFsaXphZG8oU3RyaW5nIG9yaWVudGFkb3IsIFN0cmluZyB0aXR1bG8sIFN0cmluZyBub3RhKSB7CiAgICAgICAgdGhpcy5vcmllbnRhZG9yID0gb3JpZW50YWRvcjsKICAgICAgICB0aGlzLnRpdHVsbyA9IHRpdHVsbzsKICAgICAgICB0aGlzLm5vdGEgPSBub3RhOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIFN0cmluZyBnZXREYWRvc1RyYWJhbGhvKFN0cmluZyBuaXZlbEN1cnNvKSB7CiAgICAgICAgU3RyaW5nIHJlc3AgPSAiVMOtdHVsbyAiOwogICAgICAgIHN3aXRjaCAobml2ZWxDdXJzbykgewogICAgICAgICAgICBjYXNlICJHcmFkdWHDp8OjbyI6IHJlc3AgKz0gImRvIFRDQzogIjsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIkxhdG8gc2Vuc3UiOiByZXNwICs9ICJkYSBtb25vZ3JhZmlhOiAiOyBicmVhazsKICAgICAgICAgICAgY2FzZSAiTWVzdHJhZG8iOiByZXNwICs9ICJkYSBkaXNzZXJ0YcOnw6NvOiAiOyBicmVhazsKICAgICAgICAgICAgY2FzZSAiRG91dG9yYWRvIjogcmVzcCArPSAiZGEgdGVzZTogIjsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJlc3AgKz0gdGl0dWxvICsgIlxuIjsKICAgICAgICByZXNwICs9ICJPcmllbnRhZG9yKGEpOiBQcm9mLiAiICsgb3JpZW50YWRvciArICJcbiI7CiAgICAgICAgcmVzcCArPSAiTm90YTogIiArIG5vdGEgKyAiXG4iOwogICAgICAgIHJldHVybiByZXNwOwogICAgfQp9CgovLyAzLiBTdXBlcmNsYXNzZSBhYnN0cmF0YSBwYXJhIEFsdW5vCmFic3RyYWN0IGNsYXNzIEFsdW5vIHsKICAgIHByb3RlY3RlZCBTdHJpbmcgbm9tZTsKICAgIHByb3RlY3RlZCBpbnQgbWF0cmljdWxhOwogICAgcHJvdGVjdGVkIEN1cnNvIGN1cnNvOwogICAgcHJvdGVjdGVkIGJvb2xlYW4gY3Vyc29GaW5hbGl6YWRvOwogICAgcHJvdGVjdGVkIGludCBhbm9GaW5hbGl6YWNhbzsKICAgIHByb3RlY3RlZCBUcmFiYWxob0NvbmNsdXNhbyB0cmFiYWxobzsgCgogICAgcHVibGljIEFsdW5vKFN0cmluZyBub21lLCBpbnQgbWF0cmljdWxhLCBDdXJzbyBjdXJzbywgYm9vbGVhbiBjdXJzb0ZpbmFsaXphZG8sIGludCBhbm9GaW5hbGl6YWNhbywgVHJhYmFsaG9Db25jbHVzYW8gdHJhYmFsaG8pIHsKICAgICAgICB0aGlzLm5vbWUgPSBub21lOwogICAgICAgIHRoaXMubWF0cmljdWxhID0gbWF0cmljdWxhOwogICAgICAgIHRoaXMuY3Vyc28gPSBjdXJzbzsKICAgICAgICB0aGlzLmN1cnNvRmluYWxpemFkbyA9IGN1cnNvRmluYWxpemFkbzsKICAgICAgICB0aGlzLmFub0ZpbmFsaXphY2FvID0gYW5vRmluYWxpemFjYW87CiAgICAgICAgdGhpcy50cmFiYWxobyA9IHRyYWJhbGhvOwogICAgfQoKICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGFkb3MoKTsKCiAgICAvLyBNw6l0b2RvIGF1eGlsaWFyIHBhcmEgZXZpdGFyIGR1cGxpY2HDp8OjbyBkZSBjw7NkaWdvIG5hcyBzdWJjbGFzc2VzCiAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERhZG9zQWNhZGVtaWNvcygpIHsKICAgICAgICBTdHJpbmcgcmVzcCA9ICJBbHVubzogIiArIHRoaXMubm9tZSArICJcbiI7CiAgICAgICAgcmVzcCArPSAiQ3Vyc286ICIgKyB0aGlzLmN1cnNvLmdldE5pdmVsKCkgKyAiIGVtICIgKyB0aGlzLmN1cnNvLmdldE5vbWUoKSArICJcbiI7CiAgICAgICAgaWYgKHRoaXMuY3Vyc29GaW5hbGl6YWRvKSB7CiAgICAgICAgICAgIHJlc3AgKz0gIkN1cnNvIGZpbmFsaXphZG8gZW0gIiArIGFub0ZpbmFsaXphY2FvICsgIlxuIjsKICAgICAgICAgICAgcmVzcCArPSB0cmFiYWxoby5nZXREYWRvc1RyYWJhbGhvKGN1cnNvLmdldE5pdmVsKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzcDsKICAgIH0KfQoKLy8gNC4gU3ViY2xhc3NlIHBhcmEgYWx1bm9zIHNlbSBib2xzYQpjbGFzcyBBbHVub1JlZ3VsYXIgZXh0ZW5kcyBBbHVubyB7CiAgICBwdWJsaWMgQWx1bm9SZWd1bGFyKFN0cmluZyBub21lLCBpbnQgbWF0cmljdWxhLCBDdXJzbyBjdXJzbywgYm9vbGVhbiBjdXJzb0ZpbmFsaXphZG8sIGludCBhbm9GaW5hbGl6YWNhbywgVHJhYmFsaG9Db25jbHVzYW8gdHJhYmFsaG8pIHsKICAgICAgICBzdXBlcihub21lLCBtYXRyaWN1bGEsIGN1cnNvLCBjdXJzb0ZpbmFsaXphZG8sIGFub0ZpbmFsaXphY2FvLCB0cmFiYWxobyk7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgU3RyaW5nIGdldERhZG9zKCkgewogICAgICAgIFN0cmluZyByZXNwID0gZ2V0RGFkb3NBY2FkZW1pY29zKCk7CiAgICAgICAgcmVzcCArPSAiTWVuc2FsaWRhZGU6IFIkICIgKyB0aGlzLmN1cnNvLmdldE1lbnNhbGlkYWRlKCkgKyAiXG4iOwogICAgICAgIHJldHVybiByZXNwOwogICAgfQp9CgovLyA1LiBTdWJjbGFzc2UgcGFyYSBhbHVub3MgYm9sc2lzdGFzCmNsYXNzIEFsdW5vQm9sc2lzdGEgZXh0ZW5kcyBBbHVubyB7CiAgICBwcml2YXRlIGRvdWJsZSBkZXNjb250bzsKCiAgICBwdWJsaWMgQWx1bm9Cb2xzaXN0YShTdHJpbmcgbm9tZSwgaW50IG1hdHJpY3VsYSwgQ3Vyc28gY3Vyc28sIGJvb2xlYW4gY3Vyc29GaW5hbGl6YWRvLCBpbnQgYW5vRmluYWxpemFjYW8sIFRyYWJhbGhvQ29uY2x1c2FvIHRyYWJhbGhvLCBkb3VibGUgZGVzY29udG8pIHsKICAgICAgICBzdXBlcihub21lLCBtYXRyaWN1bGEsIGN1cnNvLCBjdXJzb0ZpbmFsaXphZG8sIGFub0ZpbmFsaXphY2FvLCB0cmFiYWxobyk7CiAgICAgICAgdGhpcy5kZXNjb250byA9IGRlc2NvbnRvOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIFN0cmluZyBnZXREYWRvcygpIHsKICAgICAgICBTdHJpbmcgcmVzcCA9IGdldERhZG9zQWNhZGVtaWNvcygpOwogICAgICAgIHJlc3AgKz0gIkJvbHNpc3RhIGNvbSBkZXNjb250byBkZTogIiArIHRoaXMuZGVzY29udG8gKyAiJVxuIjsKICAgICAgICByZXNwICs9ICJNZW5zYWxpZGFkZTogUiQgIiArIHRoaXMuY3Vyc28uZ2V0TWVuc2FsaWRhZGUoKSAqICgxIC0gdGhpcy5kZXNjb250byAvIDEwMCkgKyAiXG4iOwogICAgICAgIHJldHVybiByZXNwOwogICAgfQp9CgovLyA2LiBDbGFzc2UgZGUgVGVzdGUKY2xhc3MgVGVzdGUgewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBhcmdzW10pIHsKICAgICAgICBDdXJzbyBjMSA9IG5ldyBDdXJzbygiQURTIiwgIkdyYWR1YcOnw6NvIiwgOTIwLjUwKTsKICAgICAgICBDdXJzbyBjMiA9IG5ldyBDdXJzbygiQ29tcHV0YcOnw6NvIEFwbGljYWRhIiwgIk1lc3RyYWRvIiwgMjE1MC40NSk7CgogICAgICAgIC8vIEluc3RhbmNpYW5kbyBUcmFiYWxob051bG8gcGFyYSBvIGFsdW5vIDEKICAgICAgICBUcmFiYWxob0NvbmNsdXNhbyB0MSA9IG5ldyBUcmFiYWxob051bG8oKTsKICAgICAgICBBbHVubyBhbHVubzEgPSBuZXcgQWx1bm9Cb2xzaXN0YSgiTWFydGluIEZvd2xlciIsIDExMjIzMzQ0LCBjMSwgZmFsc2UsIC0xLCB0MSwgMjAuNSk7CiAgICAgICAgCiAgICAgICAgLy8gSW5zdGFuY2lhbmRvIFRyYWJhbGhvUmVhbGl6YWRvIHBhcmEgbyBhbHVubyAyCiAgICAgICAgVHJhYmFsaG9Db25jbHVzYW8gdDIgPSBuZXcgVHJhYmFsaG9SZWFsaXphZG8oIlBldGVyIENvYWQiLCAiSW1wYWN0byBkYSBSZWZhdG9yYcOnw6NvIiwgIjkuNSIpOwogICAgICAgIEFsdW5vIGFsdW5vMiA9IG5ldyBBbHVub1JlZ3VsYXIoIktlbnQgQmVjayIsIDIyMzM0NDU1LCBjMiwgdHJ1ZSwgMjAxOSwgdDIpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYWx1bm8xLmdldERhZG9zKCkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihhbHVubzIuZ2V0RGFkb3MoKSk7CiAgICB9Cn0=