JAVA: HERANÇA E PROTEÇÃO

QUEREMOS MOSTRAR O CONCEITO DE HERANÇA DO JAVA E CONCEITOS DE PROTEÇÃO

QUEREMOS PROJETAR UM CADAFALSO (SCAFFOLDING) PARA AVALIAR (BENCHMARK) ALGORITMOS DE ORDENAÇÃO


abstract class OrdenaDouble {
   private double[] valores;
   private MetricasDeOrdenacao metricasAtuais = new MetricasDeOrdenacao();

   /** chamado para fazer a ordenacao */
   public final MetricasDeOrdenacao ordena( double[] dados ) {
      valores = dados;
      metricasAtuais.init();
      facaOrdenacao();
      return pegaMetricas();
   }

   public final MetricasDeOrdenacao pegaMetricas() {
      return (MetricasDeOrdenacao)metricasAtuais.clone();
   }

   protected final int pegaTamanhoDados() {
      return valores.length;
   }

   /** Para que as classes derivadas possam acessar os elementos */
   protected final double acessa( int i ) {
      metricasAtuais.contaAcessos++;
      return valores[i];
   }

   /** Para que as classes derivadas possam comparar elementos */
   protected final int compara( int i, int j ) {
      metricasAtuais.contComparacoes++;
      if( valores[i] == valores[j] ) {
         return 0;
      } else {
         return (valores[i] < valores[j] ? -1 : 1 );
      }
   }

   /** Para que classes derivadas possam trocar elementos */
   protected final int troca( int i, int j ) {
      metricasAtuais.contTrocas++;
      double temp = valores[i];
      valores[i] = valores[j];
      valores[j] = temp;
   }

   /** Classes derivadas usam isso -- usado por ordena */
   protected abstract void facaOrdenacao();
}

final class MetricasDeOrdenacao implements Cloneable {
   public long contAcessos,     // acessos simples
               contComparacoes, // comparacao de dois elementos
               contTrocas;      // troca de dois elementos

   public void init() {
      contAcessos = contComparacoes = contTrocas = 0;
   }

   public String toString() {
      return contAcessos + " acessos " +
             contComparacoes + " comparacoes " +
             contTrocas + " trocas";
   }

   /** Essa classe suporta clone */
   public Object clone() {
      try {
         return super.clone(); // mecanismo default funciona
      } catch( CloneNotSupportedException e ) {
         // nao pode ocorrer: this e Object permitem clone
         throw new InternalError( e.toString() );
      }
   }
}

class OrdenaPorSelecao extends OrdenaDouble {
   protected void facaOrdenacao() {
      for( int i = 0; i < pegaTamanhoDados(); i++ ) {
         for( int j = i + 1; j < pegaTamanhoDados(); j++ ) {
            if( compara( i, j ) > 0 ) {
               troca( i, j );
            }
         }
      }
   }
}

public class TestaOrdenacao {
   static double[] dadosDeTeste = {
      0.3, 1.3e-2, 7.9, 3.17,
   };

   static public void main( String[] args ) {
      OrdenaDouble ordSelecao = new OrdenaPorSelecao();
      MetricasDeOrdenacao metricas = ordSelecao.ordena( dadosDeTeste );
      System.out.println( "Metricas: " + metricas );
      for( int i = 0; i < dadosDeTeste.length; i++ ) {
         System.out.println( "\t" + dadosDeTeste[i] );
      }
   }
}

Metricas: 0 acessos 6 comparacoes 2 trocas
        0.013
        0.3
        3.17
        7.9

VAMOS VOLTAR AO ASSUNTO GERAL DE PROJETAR CLASSES VISANDO SUA EXTENSÃO

A PARTE PUBLIC:

A PARTE PROTECTED

A PARTE PRIVATE

JAVA-23 home programa anterior próxima