Você está aqui: Cards de Ética e Legislação Profissional |
||
|
||
|
|
||
Java ::: Design Patterns (Padrões de Projeto) ::: Singleton Pattern |
Padrões de projeto para iniciantes - Como usar o padrão de projeto Singleton em suas aplicações JavaQuantidade de visualizações: 12385 vezes |
|
O padrão de projeto Singleton (ou Singleton Pattern) é um dos padrões de projeto mais conhecidos e implementado extensivamente nas linguagens que suportam programação orientada a objetos, tais como Java e C#. Nesta dica eu mostrarei como implementá-lo. Uma das situações nas quais usamos o padrão Singleton é quando queremos que somente uma instância de uma determinada classe seja criada e que esta esteja disponível para todas as demais classes do sistema. Um exemplo disso é uma classe responsável por registrar logs do sistema, uma classe responsável por obter conexões com o banco de dados, ou ainda uma classe que concentra dados de configuração da aplicação. Assim, a chave do padrão Singleton é um método estático, geralmente chamado de getInstance(), que retorna uma nova instância da classe se esta ainda não foi instanciada. Se a classe já tiver sido instanciada, o método getInstance() retorna a instância já existente. Vamos ver um exemplo deste padrão em Java. Observe o código a seguir: Código para Logger.java:
package estudos;
// Uma classe Singleton responsável por gravar
// logs no sistema
public class Logger {
// variável estática e privada que guarda a instância
// atual da classe
private static Logger instancia = null;
// Método estático que retorna uma instância já existente, ou
// cria uma nova instância
public static Logger getInstance() {
if (instancia == null) {
instancia = new Logger();
}
return instancia;
}
// Construtor privado para evitar que instâncias sejam
// criadas usando new
private Logger() {
// não precisamos fazer nada aqui
}
// método usado para registrar logs
public void registrarLog(String dados) {
System.out.println("Vou registrar o log: " + dados);
}
}
Veja agora como podemos chamar o método getInstance(), obter um objeto da classe Logger e "registrar um log": Código para Main.java:
package estudos;
public class Main {
public static void main(String[] args) {
// vamos registrar um novo log usando a classe Singleton
Logger.getInstance().registrarLog("Novo usuário cadastrado.");
}
}
Ao executar esta aplicação teremos a seguinte saída: Vou registrar o log: Novo usuário cadastrado. |
C ::: Dicas & Truques ::: Ponteiros, Referências e Memória |
Como usar ponteiros void na linguagem C - Curso de Linguagem C para iniciantesQuantidade de visualizações: 17175 vezes |
Em dicas desta seção você aprendeu que é possível criar ponteiros para os mais diferentes tipos. Veja:int *ponteiro_int; float *ponteiro_float; double *ponteiro_double; Existe, porém, um tipo de ponteiro que pode ser usado com todos os tipos de dados existentes ou ainda a serem criados. Este tipo é conhecido como void, ou seja, um ponteiro genérico e pode ser declarado da seguinte forma: void *ponteiro; // ponteiro genérico Veja um trecho de código no qual usamos um ponteiro genéríco para apontar para variáveis de diferentes tipos:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int valor = 20;
float valor2 = 5.23;
void *ponteiro; // ponteiro genérico
ponteiro = &valor; // aponta para um inteiro
printf("%d\n", *(int *)ponteiro);
ponteiro = &valor2; // aponta para um float
printf("%0.2f\n", *(float *)ponteiro);
system("PAUSE");
return 0;
}
Uma observação importante é a necessidade de uma conversão explícita (cast) no momento de desreferenciar um ponteiro genéríco. Neste caso ele precisa ser convertido para o tipo de ponteiro sendo usado no momento. Veja:
printf("%d\n", *(int *)ponteiro);
A parte (int *)ponteiro converte o ponteiro genérico em um ponteiro do tipo int e o símbolo * externo é usado para desreferenciar. Se essa conversão não for feita teremos um aviso e erro na maioria dos compiladores. Veja:
printf("%d\n", *ponteiro);
[Warning] dereferencing 'void *' pointer
invalid use of void expression
Embora essa conversão seja necessária quando estamos desreferenciando um ponteiro genérico, podemos abrir mão dela na atribuição de um ponteiro genérico a um ponteiro de um tipo específico:
ponteiro = &valor; // aponta para um inteiro
int *ponteiro_int = ponteiro;
printf("%d\n", *ponteiro_int);
Para finalizar, saiba que as funções malloc() e calloc() retornam ponteiros void, ou seja, ponteiros genéricos que podem ser atribuídos a ponteiros de qualquer tipos. Neste caso, o ponteiro retornado por estas funções aponta para a primeira posição do bloco de memória requisitada. |
C++ ::: Desafios e Lista de Exercícios Resolvidos ::: Recursão (Recursividade) |
Exercício Resolvido de C++ - Um método recursivo que conta de 0 até 10Quantidade de visualizações: 1197 vezes |
|
Pergunta/Tarefa: Escreva um método recursivo que conta e exibe os valores de 0 até 10. Seu método deverá possuir a seguinte assinatura:
void contar_recursivamente(int n){
// sua implementação aqui
}
Sua saída deverá ser parecida com: 0 1 2 3 4 5 6 7 8 9 10 Veja a resolução comentada deste exercício usando C++:
#include <iostream>
#include <cstdlib>
using namespace std;
// método recursivo que conta de 0 até 10;
void contar_recursivamente(int n){
// vamos exibir o número atual
cout << n << " ";
// devemos prosseguir com a recursividade?
if(n < 10){
// incrementa o valor de n
n++;
contar_recursivamente(n); // e faz uma nova chamada recursiva
}
}
// função principal do programa
int main(int argc, char *argv[]){
// efetua uma chamada ao método recursivo fornecendo o primeiro valor
contar_recursivamente(0);
cout << "\n\n";
system("PAUSE"); // pausa o programa
return EXIT_SUCCESS;
}
|
C# ::: Dicas & Truques ::: Arquivos e Diretórios |
Como retornar o nome de um arquivo sem a extensão em C# usando o método GetFileNameWithoutExtension() da classe PathQuantidade de visualizações: 13265 vezes |
|
A função GetFileNameWithoutExtension() da classe Path do C# facilita o nosso trabalho quando precisamos obter o caminho e nome de um arquivo sem a sua extensão, ou seja, se o nome do arquivo for "video.mp4", a função nos retornará apenas "video". O método GetFileNameWithoutExtension() recebe uma string representando o caminho e nome do arquivo e retorna uma outra string contendo o nome do arquivo sem a extensão. Veja um exemplo completo de seu uso:
using System;
using System.Collections;
using System.IO;
namespace Estudos {
class Program {
static void Main(string[] args) {
// caminho e nome do arquivo com a extensão
string arquivo = "C:\\estudos_csharp\\texto.txt";
// obtém o nome do arquivo sem a extensão
string arquivo2 = Path.GetFileNameWithoutExtension(arquivo);
// exibe o resultado
Console.WriteLine("O nome do arquivo sem a extensão " +
"é: {0}", arquivo2);
Console.WriteLine("\n\nPressione qualquer tecla para sair...");
// pausa o programa
Console.ReadKey();
}
}
}
Ao executar este código C# nós teremos o seguinte resultado: O nome do arquivo sem a extensão é: texto |
Java ::: Desafios e Lista de Exercícios Resolvidos ::: Arrays e Matrix (Vetores e Matrizes) |
Exercícios Resolvidos de Java - Escreva um programa Java para mover todos os zeros para o final do vetor, sem alterar a ordem dos elementos já presentes no arrayQuantidade de visualizações: 867 vezes |
|
Pergunta/Tarefa: Dado o seguinte vetor de inteiros:
// vamos declarar e construir um vetor de 8 inteiros
int valores[] = {0, 3, 0, 5, 7, 4, 0, 9};
Sua saída deverá ser parecida com: Vetor na ordem original: 0 3 0 5 7 4 0 9 Vetor com os zeros deslocados para o final: 3 5 7 4 9 0 0 0 Veja a resolução comentada deste exercício usando Java:
package exercicio;
public class Exercicio {
public static void main(String[] args) {
// vamos declarar e construir um vetor de 8 inteiros
int valores[] = {0, 3, 0, 5, 7, 4, 0, 9};
// vamos mostrar o vetor na ordem original
System.out.println("Vetor na ordem original:\n");
for(int i = 0; i < valores.length; i++){
System.out.print(valores[i] + " ");
}
// vamos inicializar j como 0 para que ele aponte para
// o primeiro elemento do vetor
int j = 0;
// agora o laço for percorre todos os elementos do vetor,
// incrementanto a variável i e deixando o j em 0
for(int i = 0; i < valores.length; i++){
// encontramos um valor que não é 0
if(valores[i] != 0){
// fazemos a troca entre os elementos nos índices
// i e j
int temp = valores[i];
valores[i] = valores[j];
valores[j] = temp;
// e avançamos o j para o elemento seguinte
j++;
}
}
// agora mostramos o resultado
System.out.println("\n\nVetor com os zeros deslocados para o final:\n");
for(int i = 0; i < valores.length; i++){
System.out.print(valores[i] + " ");
}
System.out.println();
}
}
Não se esqueça: A resolução do exercício deve ser feita sem a criação de um vetor, array ou lista adicional, e os elementos diferentes de zero devem permanecer na mesma ordem que eles estavam antes. |
Mais Desafios de Programação e Exercícios e Algoritmos Resolvidos de Java |
Veja mais Dicas e truques de Java |
Dicas e truques de outras linguagens |
|
JavaScript - Como retornar o tamanho de uma string em JavaScript usando a propriedade length do objeto String |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
|
1º lugar: Java |


