Cum să scriu corect următorul cod?
public String toString(int[] position, int xOffset, int yOffset) {
String postn = String.format("[%d,%d]", position[0], position[1]);
String movm = String.format("[%d,%d]", xOffset, yOffset);
return (postn, movm);
}
A apărut următoarea eroare
movm cannot be returned.
Când se utilizează Java 8 ați putea utiliza Perechea clasă.
private static Pair<String, String> foo (/* some params */) {
final String val1 = ""; // some calculation
final String val2 = ""; // some other calculation
return new Pair<>(val1, val2);
}
În caz contrar, returnați pur și simplu o matrice.
- Clasa pair face parte sau
javafx
. Se poate utiliza în SE? – > . - @SubhrajyotiMajumder Începând cu JDK 7u6, JavaFX este inclus în pachetele JDK și JRE standard. – > .
- @DavidM. Sunt de acord cu tine. Mai ales atunci când se așteaptă cu nerăbdare modularizarea Java9, unde s-ar putea întâlni runtimes fără module UI instalate. O matrice sau o simplă clasă pojo ar putea fi mai elegantă. – > .
Nu puteți returna două valori diferite în metode în Java.
Atunci când apare această necesitate, aveți de obicei două opțiuni:
- Creați o clasă care are tipurile pe care doriți să le returnați și apoi returnați o instanță a acelei clase. De obicei, aceste clase sunt foarte simple, conțin membri publici și, opțional, un constructor pentru a iniția o instanță cu toate valorile necesare.
- Adăugați ca parametru al metodei un obiect de tip referință pe care metoda îl va muta cu valorile pe care doriți să le returnați. În exemplul dumneavoastră folosiți șiruri de caractere, deci acest lucru nu va funcționa, deoarece în Java șirurile de caractere sunt imuabile.
O altă opțiune ar fi utilizarea unui array de șiruri de caractere, deoarece ambele tipuri de returnare sunt șiruri. Ați putea folosi această opțiune ca valoare de returnare sau ca parametru care este modificat de metodă.
Editați: de obicei, metodele „toString” returnează doar un singur șir de caractere. Poate că ar trebui să luați în considerare concatenarea ambelor șiruri într-un singur șir folosind un separator. Exemplu:
return postn + "_" + movm;
Există patru metode la care mă pot gândi pentru a implementa acest scenariu:
1. Utilizarea unei clase
Creați o clasă care să aibă toate atributele pe care doriți să le returnați, în cazul dumneavoastră poate fi
public class Sample {
private String postn;
private String movm;
public String getPostn() {
return postn;
}
public void setPostn(String postn) {
this.postn = postn;
}
public String getMovm() {
return movm;
}
public void setMovm(String movm) {
this.movm = movm;
}
}
și modificați metoda dvs. pentru a include obiectul acestei clase și pentru a seta valorile în aceste atribute. Schimbați tipul de returnare al metodei în numele clasei, de exemplu, Sample (Exemplu).
public Sample toString(int[] position, int xOffset, int yOffset) {
String postn = String.format("[%d,%d]", position[0], position[1]);
String movm = String.format("[%d,%d]", xOffset, yOffset);
Sample obj = new Sample();
obj.setPostn(postn);
obj.setMovm(movm);
return obj;
}
2. Utilizarea unei matrice
Modificați metoda pentru a returna un array String și stocați valorile în acest array:
public String[] toString(int[] position, int xOffset, int yOffset) {
String postn = String.format("[%d,%d]", position[0], position[1]);
String movm = String.format("[%d,%d]", xOffset, yOffset);
String arr[] = new String[2];
arr[0] = postn;
arr[1] = movm;
return arr;
}
3. Utilizarea javatuples
Puteți citi detalii la link-ul http://www.javatuples.org/
4. Prin delimitarea datelor
Puteți utiliza un anumit delimitator dacă sunteți sigur de datele din variabile. Dar acest lucru va necesita un spijin cu delimitatorul, atunci când doriți să utilizați aceste valori.
public String toString(int[] position, int xOffset, int yOffset) {
String postn = String.format("[%d,%d]", position[0], position[1]);
String movm = String.format("[%d,%d]", xOffset, yOffset);
return postn+"~"+movm;
}
În Java, atunci când doriți ca o funcție să returneze mai multe valori, trebuie să
- încorporați aceste valori într-un obiect pe care îl returnezi
- sau să modificați un obiect care este transmis funcției dvs. ~ dystroy
Aveți două opțiuni (din câte știu eu) aici:
Opțiunea 1: Returnează ca o nouă matrice:
public String[] toString(int[] position,int xOffset,int yOffset) {
String postn=String.format("[%d,%d]",position[0],position[1]);
String movm=String.format("[%d,%d]",xOffset,yOffset);
string [] myArray = new string[2];
myArray[0] = postn;
myArray[1] = movm;
return myarray; //returns as array
}
Opțiunea 2: returnează ca atare
Editat pentru a arăta get set
private String a;
private String b;
public void setPostN(String s)
{
a= s;
}
public String getPostN()
{
return a;
}
public void setMovm(String s)
{
a= s;
}
public String getMovm()
{
return a;
}
cu metoda ta:
public void toString(int[] position,int xOffset,int yOffset) {
String postn=String.format("[%d,%d]",position[0],position[1]);
String movm=String.format("[%d,%d]",xOffset,yOffset);
setPostN(postn);
setMovm(movm);
//no return, but available via calling getMovm() or getPostN()
}
- obj pare să fie în mare parte C#, totuși. – > .
- o ilustrație frumoasă, dar poate doriți să vă numiți clasa dvs.
Obj
în loc deobj
și să scrieți metodele getter și setter pentru a obține un exemplu compilabil 🙂 – > . - mulțumesc pentru comentarii, @Henrik, probabil pentru că java/c# sunt foarte asemănătoare (în plus, lucrez cu 99% c# :P) – user3913686
- ObjClass pare destul de CShapry. Această întrebare este despre Java și, deoarece este o întrebare foarte simplă, acest răspuns este potențial foarte confuz. – > .
- probabil că ar fi fost suficient să le lăsăm publice 🙂 – > .
puteți fie să creați un tip de înveliș, să îl instanțiați și să îl returnați, fie să returnați un Map sau List/Array.
public String[].....
. De asemenea, @Reimeus a răspuns la întrebarea….. – > Por ha9u63ar.