Características das Linguagens de Programação - P2 – 04/07/2011 1a questão: O código a seguir é uma implementação – em desenvolvimento - de uma lista encadeada, utilizando-se generics. Os métodos pickUpFIFOElement() e PickUpLIFOElement(), por esquecimento do autor, não tratam a condição associada à lista vazia. Altere-os de forma a lançarem uma exceção EmptyListException, no caso de tentarem retirar um elemento de uma lista vazia. Forneça também o código associado à classe que implementa a exceção EmptyListException. // lista encadeada → arquivo LinkedList.java public class LinkedList <T> { public Node<T> head; public LinkedList() { head = new Node<T> (); head.link = head; } public void InsertElement(Node<T> avail) { // insert new element after the first node. avail.link = head.link; head.link = avail; } public T pickUpFIFOElement() { // recupera o primeiro elemento que foi inserido na lista. Node<T> aux = head.link; while (aux.link != head) { aux = aux.link;} return aux.info; } public T PickUpLIFOElement() { // recupera o último elemento que foi inserido na lista. Node<T> aux = head.link; head.link = aux.link; return aux.info; } } // nodo da lista → arquivo Node.java public class Node<T> { T info; Node<T> link; public Node() { this.info = null; link = null; } public Node(T info) { this.info = info; link = null; } } 2a questão: Inclua modificações no código da classe LinkedList apresentada na questão anterior de modo que uma lista encadeada só armazene e recupere objetos que sejam instâncias de subclasses da classe Number (encontrada na Java API). 3a questão: A codificação de um Action Listener em java compreende as seguintes etapas: 1. Declarar uma classe manipuladora de eventos e especificar que a classe ou implementa a interface ActionListener ou extends (herda de) uma classe que implementa a interface ActionListener . 2. Registrar uma instância da classe manipuladora de eventos como um listener dos eventos gerados por um ou mais componentes. 3. Incluir o código que implementa a listener interface. Considere o código da interface gráfica abaixo, que trata alguns eventos gerados pelo usuário ao interagir com a mesma. Identifique (sublinhando) os comandos identificados com as etapas acima e numere-os de acordo com a etapa correspondente. package event /* * Beeper.java requires no other files. */ import import import import import java.awt.*; javax.swing.JFrame; javax.swing.JPanel; javax.swing.JButton; javax.swing.JComponent; import import import import java.awt.Toolkit; java.awt.BorderLayout; java.awt.event.ActionListener; java.awt.event.ActionEvent; public class Beeper extends JPanel implements ActionListener { JButton button; public Beeper() { super(new BorderLayout()); button = new JButton("Click Me"); button.setPreferredSize(new Dimension(200, 80)); add(button, BorderLayout.CENTER); button.addActionListener(this); } public void actionPerformed(ActionEvent e) { Toolkit.getDefaultToolkit().beep(); } /** * Create the GUI and show it. For thread safety, * this method should be invoked from the * event-dispatching thread. */ private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("Beeper"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. JComponent newContentPane = new Beeper(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } } 4a questão: Considere os dois threads t1 e t2 da classe TwoThreads (incompleta). O thread t1 compreende as tarefas T1A e T1B e o thread t2 as tarefas T2C e T2D. As tarefas T1A e T2C, assim como as tarefas T1B e T2D podem ser executadas concorrentemente. No entanto a tarefa T2D só pode ser executada após o término da tarefa T1A. Insira um código de sua autoria na classe TwoThreads para garantir esta sincronização. Sugestão: Use Guarded blocks. public class TwoThreads { private class T1AB implements Runnable { long param1; T1AB(long param1) { this.param1 = param1; } public void run() { // início da execução da tarefa T1A //... // término da execução da tarefa T1A //... // início da execução tarefa T1B //... // término da execução da tarefa T1B } } private class T2CD implements Runnable { long param2; T2CD(long param2) { this.param2 = param2; } public void run() { // início da execução da tarefa T2C //... // término da execução da tarefa T2C //... // início da execução tarefa T2D //... // término da execução da tarefa T2D } } public void activateThreads (){ // cria o thread t1 e inicia a sua execução Thread t1 = new Thread(new T1AB(143)); t1.start(); // cria o thread t2 e inicia a sua execução Thread t2 = new Thread(new T2CD(247)); t2.start(); } public static void main(String[] args) { new TwoThreads().activateThreads(); } } 5a questão: Quais as diferenças entre Abstract Classes e Interfaces em Java. Boa Sorte! Prof. Oscar Luiz Monteiro de Farias