2012-01-11 23 views
5

Mam metodę, która zwróci kod błędu (int) i wynik (int). Jeśli kod błędu to , wynik jest prawidłowy. w C++, może to lubią:Jak zwrócić liczbę całkowitą w java?

int method(int& result); 

Java zwraca odnośnik, więc jeśli możemy zmienić obiekt w metodzie, zmiana jest widoczna przez rozmówcę. Ale, int nie jest klasą, więc mogłyśmy zrobić to jak to w Java:

int method(int result); 

A Long Integer są niezmienne w Javie, więc zmiana nie jest widoczna przez dzwoniącego czy zrobić to w ten sposób :

Integer method(Integer result); 

Zawiń wynik do klasy Wrapper! Ale to nie jest takie proste!

Pracuję z C++ długo i przenoszę się do Java ostatnio, to przeszkadza mi bardzo! może ktoś zapewnić rozwiązanie?

=================================

dobrze, w konkluzji, są one płynne roztwory:

  1. przechodzą tablicę jako parametr
  2. przechodzą opakowania jako parametr
  3. zwraca parę
  4. powrotu owinięcie zawierające numer błędu i spowodować
  5. wyjątkiem rzut
  6. zdać mutableint

1. i 2. uczynić moją api brzydki 3 i 4 nie wydaje się tak doskonały o 5th, ta metoda jest frequantly nazywa więc mam wziąć pod uwagę efektywność 6-te wydaje się pasować do mojej wymaga większości

dziękuję!

+4

Po prostu używaj wyjątków. Aktualizacja zmiennej przekazanej do metody wygląda śmierdząco. – Stas

+0

Można również zgłaszać wyjątki w C++. ;) –

Odpowiedz

0

Jest MutableInt komponent w bibliotece Apache Commons. Ponieważ jest zmienna, możesz przekazać ją przez odniesienie.

+0

Byłbym bardziej skłonny do użycia 'javax.xml.ws.Holder " do tego. –

+0

Interesujące, nie jestem zaznajomiony z 'Posiadaczem'. Czy istnieje różnica między używaniem tego zamiast tablicy jednoelementowej? – keyboardP

+0

Bez różnicy, z wyjątkiem tego, że _intention_ jest jaśniejsze z 'Holder'. Co jednak jest wielką różnicą. –

0

nie bardzo miły, ale:

int method(int[] result) { 
    result[0] = 1; // set result[0] as your out value 
    // etc. 
} 

Korzystanie tablicę stworzyć „sztuczny odniesienie” wobec pojedynczego int.

+0

Nie tak bardzo, jak niezbyt ładnie, ale zła. Zrób to dobrze, a zwrot powinien się ujawnić w ciągu kilku minut. –

2

Masz rację, że musisz zawinąć wartości. Jeśli wywołanie do method nie będzie zbyt częste, rozważ zgłoszenie wyjątku, aby zgłosić błąd i zakończyć działanie w inny sposób. To byłoby najbardziej podejście Java-esque. Używam tego wzorca również w moim kodzie C++ (nie podoba mi się parametry wyjściowe i zwracane wartości w tej samej metodzie, chyba że istnieją inne ciśnienia wymagające tego).

Jednak wydajność czasami wymaga więcej stylu C-system-wywołania-funkcji, którego używasz. W takim przypadku zalecam skonstruowanie typu wyniku i typu błędu, w którym można ustawić wartość.

Coś innego do rozważenia jest posiadanie klasy ogólnej (czytaj "szablon") o nazwie TwoTuple<TYPE1, TYPE2>, której można użyć do przekazania par wartości. Zauważyłem, że w Javie dużo przechodzę, choć może to być pochodna mojego osobistego stylu.:)

3

Nie możesz zwrócić więcej niż jednej liczby całkowitej dla swojej metody. Co można zrobić, to:

  • Utwórz nowy obiekt z 2 polami całkowitą i niech metoda zwraca instancję tego obiektu (zasadniczo owijką);

  • Niech twoja metoda zwróci tablicę 2 liczb całkowitych (lub weź ją jako parametr);

  • Złóż swoją metodę zwracając zmienną String o postaci <int 1>,<int 2>. Następnie można użyć numeru split(), aby uzyskać liczby z ciągu znaków i przeanalizować je z powrotem do liczb całkowitych.

  • Złóż metodę, wyrzuć wyjątek i zwróć numer.

4

Nie używaj kodów powrotu dla kodów błędów: użyj opcji Wyjątki; po to są. Po prostu zwróć rzeczywisty wynik.

1

Proponuję utworzyć niestandardowy obiekt do przechowywania obu elementów danych, np.

public class ResultData { 
    private int result; 
    private int errorCode; 

    public ResultData(int errorCode, int result) { 
     this.result = result; 
     this.errorCode = errorCode; 
    } 

    // Getters... 
} 

Następnie metoda staje:

public ResultData method() { 
    // Do stuff 
    return new ResultData(error, result); 
} 

Alternatywnie, jak inne odpowiedzi sugerują, użyj Wyjątki oznaczać jeśli wystąpił błąd iw ten sposób, jeśli metoda zwraca wynik zawsze można mieć pewność, to jest ważne. Catching the Exception oznacza, że ​​wystąpił błąd i możesz obsłużyć go w taki sposób, w jaki potraktowałbyś kod błędu.

1

Dostępne są dwa sposoby obsługi scenariusza: - 1. Mieć specjalne wartości kodów błędów, aby odróżnić je od wartości wyników (jeśli jest to możliwe). Na przykład, metoda indexOf() w tablicy ArrayList java zwraca -1, jeśli element nie występuje na liście, w przeciwnym razie zwraca indeks dodatni. 2. Użyj wyjątków dla błędnych warunków i zawsze traktuj zwracaną wartość jako poprawny wynik. Oznacza to, że jeśli metoda zwraca się bez żadnego wyjątku, załóż kod wyjścia na 0 i zapisz wartość zwracaną do wyniku.

Tworzenie niestandardowego obiektu do przechowywania wyniku i kodu wyjścia może być przesadą.

0

Zwrócenie kodu błędu nie jest dobrą praktyką w Javie. Zamiast używać wyjątków ... i lista dla wartości multiuple ...

List<Integer> method(Parameter... paramteters) 
{ 
    List<Integer> listOfValues = ... 

    //some calculations 

    if(errorCondition) throw new SomeException(); 

    //more calculations, if needed  

    return listOfValues; 
} 
0

W twoim przypadku, jeśli masz błąd, rzucać odpowiedni wyjątek. Masz również wyjątki w C++.

Wszystko inne jest prawidłowym wynikiem.


Jednak, aby odpowiedzieć na pytanie, jak zwrócić wiele wartości.

Podejście używać w wielu miejscach jest użycie interfejsu słuchacz

interface ErrorOrResult { 
    void onError(int error); 
    void onResult(int result); 
} 

a.method(errorOrResultImpl); // can use an anonymous implementation here. 

Jak widać, różne rodzaje rezultacie można nazwać dowolną ilość razy z różnymi argumentami.


Można zwrócić obiekt z dwoma polami. Jest to najbardziej zorientowany obiektowo.

Jeśli przeszkadza ci, że obiekt jest tworzony za każdym razem, możesz przekazać obiekt jako argument. Najprostszy z nich to int[], którego używasz ponownie.

int[] results = { 0, 0 }; 

a.method(results); 

Alternatywą jest zwrócenie długiego.

long result = a.method(); 
// split into two int values. 

Lub aby ta metoda stała się pełna.

int error = a.method(); 
int result = a.methodResult(); 

Albo można użyć znaku jak Collections.binarySearch robi

int errorOrResult = a.method(); 
if (errorOresult < 0) 
    int error = ~errorOrResult; 
else 
    int result = errorOrResult; 

Biorąc istnieje tak wiele alternatyw, to może chwilę przed wielu wartości zwracane są dozwolone.

+0

+1 za sugerowanie typu oddzwaniania. -1 dla reszty. –

+0

@ TomHawtin-tackline hehe, zgadzam się, że reszta jest brzydka, ale nie jest tak, że nie można tego zrobić na pół tuzina sposobów. –

0

Zwraca obiekt zawierający dwie liczby całkowite, np. wykorzystujące commons-lang v3 Pair

Pair<Integer, Integer> method(){ 
    return Pair.of(a,b) 
} 
+0

Dodawanie biblioteki innej firmy do rozwiązania tego problemu jest prawdopodobnie najgorszą sugestią do tej pory ... – jarnbjo

+1

@jarnbjo - Hardly. Zależy to od architektury OP, liczby wystąpień tej sytuacji i innych elementów biblioteki, które mogą pomóc w projekcie.Podczas gdy wyjątki mogą być lepsze w tym przypadku, inni użytkownicy czytający ten wątek, którzy mogą chcieć zwrócić wiele wartości dla celów bezbłędnych, również uznają to za przydatne. – keyboardP

0

Po pierwsze, kod błędu int? Ogólnie uważane za słabe w Javie. Wyjątek jest zwykle (ale powolny po wykonaniu). Jeśli rzeczywiście jest to typowe i/lub wydajność ma kluczowe znaczenie, wówczas zwróć coś znaczącego. Być może ładne nowe wyliczenie [2004].

Podsumowując, w jaki sposób zwracać wiele wartości. Możesz go zhackować i użyć AtomicInteger lub podobnego. Proszę nie używać tablicy!

Lepiej byłoby zwrócić znaczący (prawdopodobnie niezmienny) obiekt. Pair<,> nie jest obiektem znaczącym. (Pojawiły się pewne sugestie, aby ułatwić to w przyszłej wersji języka.)

Bardziej egzotycznym sposobem jest przekazanie obiektu wywołania zwrotnego. Jest to szczególnie przydatne, jeśli dane wynikowe różnią się w zależności od możliwych typów wyników. Niech metoda zwróci void (lub prawdopodobnie wynik wywołania zwrotnego) i doda parametr. Wywołaj metodę w zależności od typu wyniku. Dodaj tyle argumentów (w smaku) i metod, ile użytecznych. Typowy rozmówca używałby anonimowej klasy wewnętrznej i nie musiałby włączać kodu błędu. Oczywiście, powrót do metody zamykania ponownie podnosi problem, w jaki sposób uzyskać dane.

Powiązane problemy