Metodi static

Stato
Discussione chiusa ad ulteriori risposte.

HackLife

Utente Silver
26 Maggio 2008
57
11
0
73
Ciao, sempre nel mio tentativo di riuscire a scrivere qualcosa in java sto cercando di rifare un mio programma in tal linguaggio. Fin ora sono arrivato a questi due files:
Cocktail.java
Codice:
/* class Cocktail @ jDrink 
 * development version 1 @ 9710
 * copyright */


public class Cocktail {
	public String name, category, recipe;
	
	//Costruttore
	public Cocktail (String name, String category, String recipe) 
	{
		this.name = name;
		this.category = category;
		this.recipe = recipe;
	}
	//Metodi
	public String getName()
	{
		return this.name;
	}
	
	public String getCategory()
	{
		return this.category;
	}
	
	public String getRecipe()
	{
		return this.recipe;
	}
	
}
e Cookbook.java:
Codice:
/* class Cocktail @ jDrink 
 * development version 1 @ 907 10
 * copyright  */

public class Cookbook {
	//Membri
	public Cocktail[] cookbook = {
		new Cocktail("Daiquiri","pre","4.5 cl White Rum"),
		new Cocktail("Americano","pre","4.5 cl Vodka"),
		new Cocktail("Blue Lagoon","long","4.5 cl Vodka")};
	
	//Costruttore
	public Cookbook (Cocktail[] cookbook) {
		this.cookbook = cookbook ;
	}
	
	//Metodi
	public void getCocktailByCategory (String category) {
		for (Cocktail cocktail : this.cookbook) {
			if (cocktail.category == category) {
				System.out.println(cocktail.name);
			}
		}
	
	}
	
	public static void main (String args[]) {
		getCocktailByCategory("pre");
	}
	
	

}
Come avrete intuito il programma finale sarà una raccolta di ricette per cocktails.
Allo stato attuale del codice però non riesco a compilare per il seguente errore:
Codice:
 non-static method getCocktailBy Category("pre") cannot be referenced from static contest
Penso di aver capito cosa significa, ma non so come risolverlo :S
Ho provato a sostituire getCocktail... con this.getCocktail... perché mi sembrava che la logica funzionasse ma senza esito.
Avete dei suggerimenti?
Grazie, hlife.
 
premetto che nn conosco il java, ma andando un po' a sensazione, e visto e considerato che il this. nn va, prova a mettere il main in un altra classe e quindi ad istanziare un oggetto Cookbook.

Oppure aspetta il nostro caro admin che ne sa sicuramente + di me in questo campo
 
non capisco una cosa,perchè:
Codice:
public Cookbook (Cocktail[] cookbook) {
        this.cookbook = cookbook ;
    }
c'è un'altra classe che gli passa un array?o glielo passi a mano tu?
per il tuo errore: non essendo una classe statica il main scritto così non va bene dato che vuoi avviare un metodo di un oggetto (di classe Cookbook) che non è mai stato creato.
Prova con:
Codice:
public static void main (String args[]) {
        Cookbook cbk=new Cookbook(cookbook[]);
        getCocktailByCategory("pre");
    }
dove "cookbook[]" è l'array che gli devi passare per creare l'oggetto!
 
Io avrei un po di osservazioni da fare, in modo che se vuoi approfondire il linguaggio almeno sai cosa non va... Allora come ti ha detto Razor l'errore sta nel fatto che
Codice:
public void getCocktailByCategory (String category) {
        for (Cocktail cocktail : this.cookbook) {
            if (cocktail.category == category) {
                System.out.println(cocktail.name);
            }
        }
    
    }

e' un metodo della classe Cookbook. quindi per chiamare questo metodo deve esestere un oggetto Cookbook e poi invocare su di esso il metodo getCocktailByCategory(). Avendo tu invece scritto direttamente nel main getCocktailByCategory() e non esistendo in memoria un Oggetto Cocktail, il compilatore java presuppone che il metodo sia un metodo static, (quindi la firma sarebbe stata public static void getCocktailByCategory()) e quindi da dentro il main avresti potuto richiamare il metodo come hai fatto tu.

Altre 2 cose che vorrei dirti sono: anche se e' una cosa piccola, almeno per ora, io ti invito cmq da vedere sin da subito le collezioni di java, ed abbandonare gli array. L'altra cosa e': che senso ha utilizzare gli oggetti, e quindi con tutte le considerazioni che ha alle spalle, creando oggetti con metodi get/set, se poi tutte le variabili sono dichiarate public e quindi accedibili da qualsiasi altra classe? tipo:
Codice:
Cocktail c = new Cocktail("bla", "bla", "bla");
String ricetta = c.recipe;

Buon lavoro.
 
precisamente vheon,è inutile scrivere metodi get/set se poi le variabili della classe sono public,questo viene fatto solo quando le variabili vengono dichiarate private quindi inaccessibili da classi esterne.Per il resto,bhe l'ho detto in modo più essenziale e coinciso.Per quanto riguarda gli array penso che dipende molto dai casi,ad esempio in casi in cui sai precisamente quanti oggetti (che siano stringe,interi o oggetti di altre classi) devi utilizzare allora l'array direi che va più che bene,in casi come questo utilizzare array (in cui in fase di dichiarazione dell'array devi specificare quanti oggetti esso può contenere) non va molto bene dato che ti limita molto il massimo numero di cocktail che puoi memorizzare,ad esempio potresti utilizzare la classe Arraylist che utilizza gli array ma che modifica la capacità ad ogni inserimento.In questo modo non sei obbligato a specificare il numero massimo di cocktail memorizzabili ma ne puoi inserire quanti ne vuoi dato che la dimensione dell'array varia ogni volta.
 
Ciao raazzi sccusate il ritardo ma in questo periodo sono in giro per il mondo :p
Comincio con il ringraziarvi dei suggerimenti e mi scuso perché mi rendo conto che sono poco pratico di caratteristiche del java che in python ignoravo completamente. Capito l'errore che ho fatto mi rendo conto che era veramente banale :p Per quanto riguarda le collezioni, appena tornerò a casa e avrò un po' di tempo a mia disposizione mi metto a cercare cosa sono visto che usare gli array in effetti non mi è mai piaciuto. Invece riguardo agli attributi private o public, prima di decidere cosa usare devo scoprire qual'è il vantaggio di definirli private.

Di nuovo grazie per il vostro tempo.
Ci sentiamo presto ;)
 
se hai due classi A e B,ed a1 è definito come public e b1 è definito come private la classe B (attraverso i suoi metodi) potrà accedere ad a1.Al contrario,la classe A non potrà accedere a b1 dato che è di tipo private,a b1 potranno accedere solo i metodi della stessa classe B.
 
secondo me prima di metterti a fare altra roba in java ti devi mettere a studiare bene l'OO(A|D|P)... java (purtroppo o per fortuna, dipende da chi ascolti) e' un linguaggio completamente ad oggetti, che se non usato bene porta solo che a codice orribile poco mantenibile e si rischia facilmente di cadere in antipattern che sono (secondo me) da evitare come la peste...
 
[ot]ma avete moderato il mi messaggio o non è mai stato pubblicato per qualche ragione? Considerato che mi connettevo dalle reti più assurde è anche possibile ^^'' [/ot]
 
[ot]ecco perché nessuno mi rispondeva xD Vabbé non mi pare ci fosse nulla di determinante xD[/ot]
Grazie a tutti per l'aiuto!
 
ricordo bene che questo topic aveva altri messaggi (anche miei), purtroppo essi furono postati quando infernet ebbe strani problemi che portarono ad un ripristino del db di quasi una settimana prima, con conseguente perdita di tutti i post.
 
Stato
Discussione chiusa ad ulteriori risposte.