Trilhas
/
Java
Java
/
Exercícios
/
As linguagens de Karl
As linguagens de Karl

As linguagens de Karl

Exercício de aprendizagem

Introdução

Tipos genéricos

Um tipo genérico é uma classe ou interface genérica que é parametrizada por tipos. Isso permite que o compilador garanta a segurança de tipos na classe ou na interface.

Considere esta interface Container, que não é genérica:

class Container {
    private Object object;

    public void set(Object object) { this.object = object; }
    public Object get() { return object; }
}

Como ela aceita e retorna tipos Object, funciona com qualquer tipo não primitivo. No entanto, isso tem um custo: um trecho de código pode chamar get esperando Integers, enquanto outro chama set adicionando Strings, o que resulta em uma exceção em tempo de execução.

Uma classe genérica e uma interface genérica têm o seguinte formato:

class ClassName<T1, T2, ..., Tn> { ... }
interface InterfaceName<T1, T2, ..., Tn> { ... }

A seção de parâmetros de tipo, delimitada pelos sinais de maior e menor (<>), logo depois do nome da classe ou da interface, especifica os parâmetros de tipo (também chamados de variáveis de tipo) T1, T2, ..., e Tn. Eles podem ser usados dentro do corpo da classe ou da interface para obter a segurança de tipos genérica.

Aqui está a versão genérica de Container:

class Container<E> {
    private E object;

    public void set(E object) { this.object = object; }
    public E get() { return object; }
}

Ao criá-la, agora precisamos declarar qual tipo ela armazena, e o compilador vai garantir essa restrição:

// empty <> can infer from context
Container<String> stringContainer = new Container<>();
// compiler knows this is a String, so it is allowed
stringContainer.set("Some string");
// no cast needed, compiler knows it is a String
String result = stringContainer.get();
// this causes a compiler error:
stringContainer.set(42);

Listas

As listas são a coleção de sequências ordenadas do Java. Diferente dos arrays, uma List pode crescer de tamanho para acomodar qualquer número de itens. Uma implementação padrão é a ArrayList, que é sustentada por um array redimensionável. Outra implementação padrão é a classe LinkedList, que é sustentada por uma lista duplamente encadeada.

As Lists podem estar vazias ou conter qualquer número de itens (incluindo duplicatas). As Lists são uma interface genérica tipada para indicar qual tipo de objeto elas podem conter. Por exemplo:

List<String> emptyListOfStrings = List.of();
List<Integer> singleInteger = List.of(1);
List<Boolean> threeBooleans = List.of(true, false, true);
List<Object> listWithMultipleTypes = List.of("hello", 1, true);

As Lists têm vários métodos úteis para adicionar, remover, obter e verificar se um elemento está presente:

List<Character> vowels = new ArrayList<>(List.of('a', 'e', 'i', 'o', 'i', 'e', 'a'));
int startingSize = vowels.size(); // 7
vowels.add('u'); // vowels is now ['a', 'e', 'i', 'o', 'i', 'e', 'a', 'u']
char a = vowels.get(0); // 'a'
boolean hadI = vowels.remove('i'); // true and vowels is now ['a', 'e', 'o', 'i', 'e', 'a', 'u']
boolean hasI = vowels.contains('i'); // true (still have one more left)

Instruções

Karl quer acompanhar uma lista de linguagens de programação para aprender no site do Exercism. Karl precisa conseguir adicionar novas linguagens, remover as antigas e verificar se certas linguagens estão na lista. Seria muito empolgante se Karl quiser aprender Java ou Kotlin!

1. Defina uma função para verificar se a lista de linguagens está vazia

Karl precisa saber se a lista de linguagens dele fica vazia em algum momento, para poder procurar mais linguagens para aprender! Defina um método chamado isEmpty que retorna true se não houver linguagens na lista.

if (languageList.isEmpty()) {
    findMoreLanguagesToLearn();
}

2. Defina uma função para adicionar uma linguagem à lista

Karl está ansioso para aprender Kotlin e Python! Ajude Karl a começar definindo um método chamado addLanguage, que recebe a linguagem que ele quer aprender e a adiciona à lista.

languageList.addLanguage("Kotlin");
languageList.addLanguage("Python");

3. Defina uma função para remover uma linguagem da lista

Karl decidiu que não quer aprender Scala agora. Ajude Karl a removê-la da lista definindo um método chamado removeLanguage, que recebe a linguagem que ele está removendo e a remove da lista.

languageList.removeLanguage("Scala");

4. Defina uma função para retornar o primeiro item da lista

Karl quer lembrar a primeira linguagem que ele adicionou à lista (que ainda está na lista). Defina um método chamado firstLanguage que retorna a primeira linguagem da lista.

String kotlin = languageList.firstLanguage(); // "Kotlin"

5. Defina uma função para retornar quantas linguagens estão na lista

Karl precisa saber quantas linguagens ele está tentando aprender. Ajude Karl a encontrar a resposta definindo um método chamado count, que retorna o número de linguagens na lista.

int two = languageList.count(); // 2

6. Defina uma função para determinar se uma linguagem está na lista

Karl está tentando lembrar se queria aprender Python ou Ruby. Defina um método chamado containsLanguage, que recebe a linguagem sobre a qual ele está perguntando, para que Karl descubra!

boolean learningPython = languageList.containsLanguage("Python"); // true
boolean learningRuby = languageList.containsLanguage("Ruby"); // false

7. Defina uma função para determinar se a lista é empolgante

Se Karl quiser aprender Java ou Kotlin, isso é muito empolgante! Defina um método chamado isExciting que retorna true se Karl quiser aprender Java ou Kotlin.

javaLanguageList.isExciting() // true
neitherKotlinNorJavaLanguageList.isExciting() // false
Editar via GitHub O link abre em uma nova janela ou aba
Java Exercism

Tudo pronto para começar As linguagens de Karl?

Crie sua conta no Exercism para aprender e dominar Java com 26 conceitos158 exercícios e mentoria humana de verdade, tudo de graça.