Creare nuova istanza di un metodo static

di il
5 risposte

Creare nuova istanza di un metodo static

Buonasera a tutti.
Ho sviluppato questo codice per poter ottenere una stringa aggiornata con i campi di giorno, mese, anno, ora, minuto .

package applicazioneGestione.utility;

import java.util.GregorianCalendar;

public class GetDate {
	
	public static GregorianCalendar actualDate = new GregorianCalendar();
	static String ActualYearString,ActualMonthString,ActualDayString;
	static String ActualHourString,ActualMinuteString;
	
	public static int getActualDay(){
		int ActualDay=1;
		ActualDay = actualDate.get(GregorianCalendar.DAY_OF_MONTH);
		return ActualDay;}
	
	public static int getActualMonth(){
		int ActualMonth=1;
		ActualMonth = actualDate.get(GregorianCalendar.MONTH)+1;
		return ActualMonth;}
	
	public static int getActualYear(){
		int ActualYear=1990;
		ActualYear = actualDate.get(GregorianCalendar.YEAR);
		return ActualYear;}
	
	public static int getActualHour(){
		int ActualHour=0;
		ActualHour = actualDate.get(GregorianCalendar.HOUR_OF_DAY);
		return ActualHour;}
	
	public static int getActualMinute(){
		int ActualMinute=0;
		ActualMinute = actualDate.get(GregorianCalendar.MINUTE);
		return ActualMinute;}

	public static String getActualYearString(){
		ActualYearString = Integer.toString(getActualYear());
		return ActualYearString;}	
	
	public static String getActualDayString(){
		ActualDayString = Integer.toString(getActualDay());
		return ActualDayString;}	
	
	public static String getActualHourString(){
		ActualHourString = Integer.toString(getActualHour());
		return ActualHourString;}	

	public static String getActualMinuteString(){
		ActualMinuteString = Integer.toString(getActualMinute());
		return ActualMinuteString;}	
				
	public static String composeMonthString(){
		int MeseAttualeInt = getActualMonth();
		String ComposedMonth = null;
			if(MeseAttualeInt==1){
				ComposedMonth = "gennaio";		
			}else if(MeseAttualeInt==2){
				ComposedMonth = "febbraio";				
			}else if(MeseAttualeInt==3){
				ComposedMonth = "marzo";				
			}else if(MeseAttualeInt==4){
				ComposedMonth = "aprile";				
			}else if(MeseAttualeInt==5){
				ComposedMonth = "maggio";				
			}else if(MeseAttualeInt==6){
				ComposedMonth = "giugno";				
			}else if(MeseAttualeInt==7){
				ComposedMonth = "luglio";				
			}else if(MeseAttualeInt==8){
				ComposedMonth = "agosto";				
			}else if(MeseAttualeInt==9){
				ComposedMonth = "settembre";				
			}else if(MeseAttualeInt==10){
				ComposedMonth = "ottobre";				
			}else if(MeseAttualeInt==11){
				ComposedMonth = "novembre";				
			}else if(MeseAttualeInt==12){
				ComposedMonth = "dicembre";}
		return ComposedMonth;
	}
	
	public static String getLogDate(){

		String LogDate = null;
		String anno = getActualYearString();		
		String mese = composeMonthString();
		String giorno = getActualDayString();
		String ora = getActualHourString();
		String minuto = getActualMinuteString();
		
		LogDate = giorno.concat(mese).concat(anno).concat("-").concat(ora).concat(":").concat(minuto);
		
		System.out.println("La stringa ottenuta è: " + LogDate);
		
		return LogDate;
	}
		
}//Chiude la classe GetDate

Ora il mio problema è questo: tutti i metodi dichiarati in questa classe sono di tipo static quindi, quando io istanzio una chiamata al metodo getLogDate il tutto funziona benissimo, e mi restituisce la mia stringa perfettamente formattata aggiornataal minuto.

Il problema però e che il riferimento a questa classe è di tipo static, quindi non sò come fare a "chiudere" questa istanza, evocarne una nuova per ottenere una seconda stringa, generata dalla medesima funzione, ma aggiornata al minuto seguente, in modo da avere tante stringhe diverse, aggiornate all'ora in base alle varie chiamate alla stesse funzione.

Io credo che il problema sia dovuto proprio al modificatore "static", che mi istanzia in memoria la variabile "getLogDate" ma aggiornata alla prima invocazione del metodo, e non mi permette di istanziarne una seconda, od una terza, perchè static mantiene un riferimento unico.

Dunque chiedo: c'è un modo di "chiudere" l'attuale istanza e di generarne una nuova ad ogni chiamata?

Non posso, o meglio, non sò come togliere il modificatore "static" perchè sembra che la classe chiamante lo esiga.

Qualora possa servire, appendo anche il codice della classe chiamante:

package applicazioneGestione.Action;

import java.io.IOException;
import java.util.HashMap;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import applicazioneGestione.ActionForm.LoginActionForm;
import applicazioneGestione.utility.GetDate;

public class LoginAction extends Action {

	public ActionForward execute(ActionMapping mapping, 
							     ActionForm form,
							     HttpServletRequest request, 
							     HttpServletResponse response)
							     throws IOException, ServletException {	
		
		//Qui creo una variabile di tipo HashMap, all'interno della quale appoggio i valori
		//di tutti i pin della raspi
		HttpSession session = request.getSession();//Ottengo la session
		HashMap<String, String> RaspiPinMap = new HashMap<String, String>();//Creo la nuova HashMap
		session.setAttribute("RaspiPinMap", RaspiPinMap);//Metto l'HashMap in session
		
		//Qui creo una nuova variabile boolean che metto sempre nello scope, nella quale, in 
		//seguito aggiornerò il valore scelto dall'utente se vuole abilitare o meno i log
		boolean LoggerAbilitation = true;
		session.setAttribute("LoggerAbilitation", LoggerAbilitation);
		
		String usernameDaForm = null;
		String passwordDaForm = null;
		String LoggerAbilit = null;
		
		//Instanzio un nuovo Logger e lo chiamo: "GlobalLogger"
		Logger Log = Logger.getLogger("GlobalLogger");

		LoginActionForm DatiDiAccesso = (LoginActionForm) form;

		usernameDaForm = DatiDiAccesso.getUsername();
		passwordDaForm = DatiDiAccesso.getPassword();
		
		LoggerAbilit = request.getParameter("LogAbilitation");
		if(LoggerAbilit.equals("LogEnabled")){
			//Se arrivo qui, vuol dire che l'utente ha scelto di abilitare i logs
			LoggerAbilitation = true;
			session.setAttribute("LoggerAbilitation", LoggerAbilitation);
			FileHandler fh = new FileHandler("FileDiLog"); 
			Log.addHandler(fh);
			Log.setLevel(Level.ALL);
			
		}else if (LoggerAbilit.equals("LogDisenabled")){
			//Se arrivo qui vuol dire che l'utente disabilita i logs.
			//E quindi aggiorno la variabile in session
			LoggerAbilitation = false;
			session.setAttribute("LoggerAbilitation", LoggerAbilitation);}	
		
		GetDate.getLogDate();
		
		if (usernameDaForm == null) {
			return (mapping.findForward("stay"));
		} else if (usernameDaForm.equals("leonardo") && passwordDaForm.equals("ombra")) {
			return (mapping.findForward("successLogin"));
		} else
			return (mapping.findForward("failLogin"));

	}// Chiude il metodo execute
	
	@SuppressWarnings("unchecked")
	public static HashMap<String, String> EstraiRaspiHashMap(HttpSession session){
		HashMap<String, String> RaspiPinMap = (HashMap<String, String>) session.getAttribute("RaspiPinMap");
		return RaspiPinMap;
	}//Chiude il metodo EstraiRaspiHashMap
	
}// Chiude la classe LoginAction



La classe chiamante sò che funziona bene.

5 Risposte

  • Re: Creare nuova istanza di un metodo static

    harpefalcata ha scritto:


    Ora il mio problema è questo: tutti i metodi dichiarati in questa classe sono di tipo static quindi, quando io istanzio una chiamata al metodo getLogDate il tutto funziona benissimo, e mi restituisce la mia stringa perfettamente formattata aggiornataal minuto.

    Il problema però e che il riferimento a questa classe è di tipo static, quindi non sò come fare a "chiudere" questa istanza, evocarne una nuova per ottenere una seconda stringa, generata dalla medesima funzione, ma aggiornata al minuto seguente, in modo da avere tante stringhe diverse, aggiornate all'ora in base alle varie chiamate alla stesse funzione.
    Il punto è che quella classe GetDate ha un design generale che non è granché buono. Tra l'altro, se devi solo formattare una data, perché devi fare tutti quei giri invece che usare un DateFormat? Hai vincoli riguardo cose che ti è stato chiesto di non usare?
  • Re: Creare nuova istanza di un metodo static

    Non ho alcun genere di limite o vincolo.

    Sò dell'esistenza dei metodi di formattazione nativi della libreria GregorianCalendar, ed in realtà li potrei anche usare, ma temo che ciò non risolva il problema principale.

    Se anche questi ultimi li istanziassi con la clausola "static", quando poi li andassi ad evocare una seconda o terza volta, per avere la stringa aggiornata al minuto seguente, l'unica lettura che avrei in uscita sarebbe quella relativa alla sola prima invocazione.

    Inoltre dovrei fare un cast dal dateFormat ad una stringa.

    Lo scopo ultimo dell'intera classe che usa GregorianCalendar, è solo quello di formare una stringa che poi userò come titolo da passare al logging per realizzare un sistema di log, ma vorrei che i vari log siano distribuiti in base al timestamp.

    Devo quindi avere un metodo che mi permetta di avere una stringa che contenga anno,mese,giorno,ora e minuto; questa stringa poi la imposterò come handler del logger e tutti i log dell'applicazione, quando quest'ultima girerà a runtime verranno appesi in file divisi in base al tempo.

    Comunque sono aperto ad ogni genere di suggerimento.

    Tu come suggeriresti?

    Grazie mille.
  • Re: Creare nuova istanza di un metodo static

    harpefalcata ha scritto:


    Devo quindi avere un metodo che mi permetta di avere una stringa che contenga anno,mese,giorno,ora e minuto; questa stringa poi la imposterò come handler del logger e tutti i log dell'applicazione, quando quest'ultima girerà a runtime verranno appesi in file divisi in base al tempo.
    A fronte di questa frase mi vengono in mente due cose:
    1) quindi per ogni minuto c'è un file di log separato? Non ti sembra eccessivo "al minuto"?

    2) tieni presente che se vuoi gestirlo tutto da zero, per me è ok. Ma sappi che ci sono librerie di logging apposite come la ben nota log4j che è già in grado di appendere i log facendo il "rolling" su più file distinti per giorni, ore ecc... E il tutto senza scrivere 1 riga di codice ma solo con una apposita configurazione esterna, che è quello che si fa tipicamente.

    Dal codice che hai postato vedo che stavi usando la JUL, abbreviazione tipica per la java.util.logging. Questo è un piccolo framework di logging integrato nel Java Standard Edition ma è inferiore come funzionalità a log4j. E non mi pare (vado a memoria) sia in grado di fare il rolling.

    Morale della favola, come si dice, prima di partire in "quarta" con una tua forse rocambolesca implementazione, valuta almeno l'uso di log4j.
  • Re: Creare nuova istanza di un metodo static

    andbin ha scritto:


    A fronte di questa frase mi vengono in mente due cose:
    1) quindi per ogni minuto c'è un file di log separato? Non ti sembra eccessivo "al minuto"?
    Forse è un pò eccessivo, ma questa è una decisione che mi potrò permettere in un secondo momento, magari andando a scrivere ogni quarto d'ora, ogni ora, oppure solo in base al generarsi di particolari eventi, ma la cosa importante è che questi log siano associati al timestamp corretto.

    In ogni caso tutta la web-app alla fine andrà deployata su una raspberry sulla quale ho già installato l'application Server, e sulla quale rimarrà una pen drive da 16 Gb, interamente dedicata ai log.
    Quindi confido nel fatto che il sistema abbia autonomia sufficiente, per memorizzare logs prima di necessitare di un intervento manuale perchè la memoria è satura.

    andbin ha scritto:


    2) tieni presente che se vuoi gestirlo tutto da zero, per me è ok. Ma sappi che ci sono librerie di logging apposite come la ben nota log4j che è già in grado di appendere i log facendo il "rolling" su più file distinti per giorni, ore ecc... E il tutto senza scrivere 1 riga di codice ma solo con una apposita configurazione esterna, che è quello che si fa tipicamente.

    Dal codice che hai postato vedo che stavi usando la JUL, abbreviazione tipica per la java.util.logging. Questo è un piccolo framework di logging integrato nel Java Standard Edition ma è inferiore come funzionalità a log4j. E non mi pare (vado a memoria) sia in grado di fare il rolling.
    L'uso che dovrò fare del log non è così esteso da giustificare una libreria che potrebbe comunque essere anche più potente, quindi suppongo che la java.util.logging abbia le qualifiche che mi interessano, se riuscirò a risolvere questo problema allora persisterò nell'usarla, altrimento farò il revert alla log4j.
  • Re: Creare nuova istanza di un metodo static

    harpefalcata ha scritto:


    L'uso che dovrò fare del log non è così esteso da giustificare una libreria che potrebbe comunque essere anche più potente, quindi suppongo che la java.util.logging abbia le qualifiche che mi interessano, se riuscirò a risolvere questo problema allora persisterò nell'usarla, altrimento farò il revert alla log4j.
    Ok, capisco. E comunque quando prima dicevo che la JUL non fa il rolling di per sé mi sbagliavo (infatti non ero proprio sicuro). Quindi sono andato a rileggermi la documentazione ufficiale e .... nella sezione Handlers dice:

    FileHandler: A handler that writes formatted log records either to a single file, or to a set of rotating log files.

    Quindi il punto positivo è che questo FileHandler predefinito il rolling lo fa ma .. il punto negativo è che la specifica del pattern per distinguere i file non è così "evoluta" come quella di log4j. Basta che guardi il javadoc di java.util.logging.FileHandler. Il rolling lo fa solo arrivando ad un limite di dimensione e per distinguere i file rotati può solo usare un contatore 0, 1, 2 ecc..

    Se vuoi usare JUL per fare rolling es. al minuto ... all'ora o altro, se vuoi fare la cosa davvero "pulita" ti tocca implementare un apposito handler, estensione di java.util.logging.Handler.
    E anzi, magari prima fai una ricerca per vedere se qualcuno ha già fatto una implementazione utile.
Devi accedere o registrarti per scrivere nel forum
5 risposte