Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

γεια σας , μηπως μπορει  καποιος  να μου πει εναν ασφαλη τροπο  για να κραταει τη τιμη της μια τοπικη μεταβλητη που ειναι ορισμα στη μεθοδο  και μετα το περας της μεθοδου στην εκτελεση  στη Java;

η τοπικη μεταβλητη δινεται στη μεθοδο ως παραμετρος , η μεθοδος της καταχωρει καποια τιμη αλλα δεν επιστρεφει αυτη τη μεταβλητη αλλα καποια αλλη.

H μεθοδος καλειται σε αλλη κλαση απο αυτη που εχει δηλωθει και το προβλημα ειναι οτι ενημερωνει τη τιμη της μεταβλητης που επιστρεφει η μεθοδος , αλλα δεν  ενημερωνει τη τιμη της παραμετρου (ορισμα)  της μεθοδου , για την ακριβεια την ενημερωνει μεσα στη  μεθοδο αλλα οταν βγει απο αυτη εχει χασει τη πληροφορια (λογω εμβελειας λογικα).

Ευχαριστω προκαταβολικα . 

 

Επεξ/σία από nek1313
Δημοσ.

Μήπως το πραγματικό σου πρόβλημα είναι ότι οι 2 κλάσεις δεν κουμπώνουν μεταξύ τους;

Αν δεν κατάλαβα καλά, δώσε με παράδειγμα τι θες να κάνεις.

Δημοσ. (επεξεργασμένο)

ευχαριστω , ας γινω λιγο πιο συγκεκριμενος . Επιτηδες τα ονοματα ειναι ετσι .

εχω μια κλαση Α στην οποια εχω μια μεθοδο που μεσα και σε αλλα υπαρχουν αυτες οι 2 σειρες 

ArrayList<String []> par2 = new ArrayList<String []>();
String[] Y = object1.methodofobject1(par1,par2); // par1 is String ,par2 is ArrayList<String []>
  

η ιδια μεθοδος μετα χρησιμοποιει το Υ και το par2 .

Με το Υ ειναι ok , αλλα στο par2 δεν εχει περασει τη τιμη που της εβαλε η μεθοδος , ειναι κενη ( [ ]) οπως την δινω ως ορισμα στη methodofobject1 , δε της εδωσε τη τιμη που της δινει μεσα η methodofobject1

Σε μια αλλη κλαση  με ονομα Object1 εχω γραψει τη  methodofobject1  που κανει κατι τετοιο 

public String [] methodofobject1 (String x1 , ArrayList<String[]> x2)
	{
		
		for (object2 element : collectionofobjects2) 
		{
			if (element.method1ofobject2().equals(x1)) 
			{
				x2 = element.method2ofobject2(); // edw exei enhmerwsei to x2 epityxws , opws katalaba apo mia println pou ebala apo katw 
				return element.method3ofobject2();
			}
		}	
		return null;
	}

καμια ιδεα τωρα  , νομιζω οτι φταιει αυτο που ειπα αρχικα .

υπαρχουν και αλλες κλασεις φυσικα αλλα νομιζω οτι δεν επηρεαζουν σε αυτο 

Επεξ/σία από nek1313
Δημοσ.

Απλή λογική:

Αφού θέλεις το par2 να αλλάζει καταστάσεις και να ενημερώνεται, γιατί δεν του δίνεις την ιδιότητα ενός field σε κλάση;

Μήπως ο σχεδιασμός κλάσεων είναι λίγο πρόχειρος;

Δημοσ. (επεξεργασμένο)

ναι καλα λες , αλλα πρεπει να υλοποιησω ενα interface(πες ενα contract) και δε μπορω να αλλαξω τη κλαση Α , ουτε μπορω να αλλαξω τη μορφη της methodofobject1 .

αυτο που μπορω να κανω ειναι να αλλαξω τις βοηθητικες κλασεις . Τελικα φταιει αυτο που ειχα πει αρχικα ?

Δεν υπαρχει καποιος τροπος να μονιμοποιησω την αλλαγη , χωρις να βαλω πεδιο  ;

Δηλαδη ειναι υποχρεωτικο να το δινω το par2 ως ορισμα στη   methodofobject1 , αυτη θα πρεπει να του βαζει μια τιμη και να τη διατηρει .

αλλά γιατι δε τη βαζει με αυτες τις 2 σειρες 

ArrayList<String []> par2 = new ArrayList<String []>();
String[] Y = object1.methodofobject1(par1,par2);

, ειναι καπως περιεργο .

Επεξ/σία από nek1313
Δημοσ.

Πρέπει να κάτσεις να διαβάσεις λίγο Design Patterns.. Ο ρουμάνος Baeldung εχει ωραία παραδείγματα και εξήγηση στο web site του. 

Δημοσ. (επεξεργασμένο)
9 ώρες πριν, nek1313 είπε

 

Δηλαδη ειναι υποχρεωτικο να το δινω το par2 ως ορισμα στη   methodofobject1 , αυτη θα πρεπει να του βαζει μια τιμη και να τη διατηρει .

αλλά γιατι δε τη βαζει με αυτες τις 2 σειρες 


ArrayList<String []> par2 = new ArrayList<String []>();
String[] Y = object1.methodofobject1(par1,par2);

, ειναι καπως περιεργο .

Δεν είναι περίεργο.

Το par2 χρησιμοποιείται μόνο μέσα στη μέθοδο και επιπλέον δεν έχει κάποιο setter (αφού δεν είναι field) να του αλλάξει τιμή εκεί μέσα. Και το λες και μόνος σου, ότι θες να έχεις πρόσβαση στις νέες τιμές του par2. Δε χρειάζεται κάτι άλλο για να καταλάβεις ότι το par2 πρέπει να είναι field.

Μπορείς να ορίσεις και άλλη μέθοδο που να σου επιστρέφει το par2 αλλαγμένο, αλλά μπλέκουμε πολύ...Προσπαθούμε να διορθώσουμε την πατέντα με πατέντα...

Δες πάλι τις κλάσεις σου και ξανασχεδίασε.

Ένα απλό και κατανοητό παράδειγμα είναι αυτό:

https://medium.com/@smagid_allThings/uml-class-diagrams-tutorial-step-by-step-520fd83b300b

Επεξ/σία από Lanike71
Δημοσ.

ok ,  μηπως υπαρχει κανας modifier(ισως ο final μπορει να κανει κτ) που να μπορει να λυσει το προβλημα  ,χωρις να βαλω το par2 για πεδιο ?

Δημοσ.

Στο σημείο: x2 = element.method2ofobject2(); στη μέθοδο methodofobject1

αναθέτεις στο x2 μια νέα "reference". Όταν επιστρέψει η μέθοδος δεν έχει καμία επίπτωση στο x2 γιατί και τα objects, (references δηλαδή αυτών) περνιούνται στις μεθόδους "by value" 

H reference δηλαδή θα αναφέρεται στο par2 μετά την κλήση της μεθόδου.

Αυτό που μπορείς να κάνεις είναι να αλλάξεις τις τιμές των πεδίων των objects,

εν προκειμένω στον κώδικά σου….

μη γράψεις x2 = element.method2ofobject2(); αλλά να αντιγράψεις μία προς μία, τις τιμές των δεδομένων του (element?) στo x2(par2). 

Κατά τα άλλα κάνε ό,τι σου γράφουν. 

  • Thanks 1
Δημοσ.

@marios28

δυστυχως δε δουλευει αυτο που λες απο μόνο του  (αντιγραφή μία προς μία, τις τιμές των δεδομένων του (element?) στo x2(par2)).

Δημοσ.
21 hours ago, nek1313 said:

Με το Υ ειναι ok , αλλα στο par2 δεν εχει περασει τη τιμη που της εβαλε η μεθοδος , ειναι κενη ( [ ]) οπως την δινω ως ορισμα στη methodofobject1 , δε της εδωσε τη τιμη που της δινει μεσα η methodofobject1

Το πιο απλό που μπορείς να κάνεις είναι να μην κάνεις reassign την par2 μέσα στη methodofobject1, αλλά να την τροποποιείς κατευθείαν.

Λείπουν πολλές πληροφορίες για μια πιο στοχευμένη απάντηση, από αυτά που δείχνεις φαίνεται μια ιδέα αχταρμά αλλά δε φαίνεται τι ακριβώς προσπαθούμε να κάνουμε στη methodofobject1.

Όταν λέω τι προσπαθούμε να κάνουμε, εννοώ: περνάς μέσα μια παράμετρο, και περιμένεις επιστρέφοντας να πάρεις πληροφορία από εκεί μέσα. Τι ακριβώς συμβαίνει; Είναι αυτό που θα λέγαμε out parameter η par2? Είναι in+out parameter? Αν η methodofobject1 κάνει reassign τότε αυτός που την έγραψε ενδεχομένως δεν καταλαβαίνει τι γίνεται εδώ, οπότε μπορούμε εν τέλει να έχουμε απάντηση στο "τι ακριβώς προσπαθείς να πετύχεις" ή όχι;

Είναι πολλά.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...