2013-05-24 33 views
5

Mam podpis metody w ten sposób.Efektywne przekazywanie parametrów w metodzie w java

public void calculateFinalInvoice(int a, int b, int c, int d, int e, int f, int g, int h, int i, InvoiceDO invoiceDO) { 
    // TO DO 

} 

Przekazuję niektóre parametry. Więc lepiej jest przekazać wszystkie te parametry pod względem wydajności. Lub 1) utrzymuj klasę dla wszystkich tych parametrów 2) utrzymuj HashMap dla wszystkich tych parametrów 3) zachowaj dla tego celu ArrayList.

Czy możesz zaproponować, który z nich jest lepszy do osiągnięcia wydajności.

+0

Czy zawsze 'a do I' liczby parametrów? –

+0

jak często jest to nazywane? – waldol1

+9

Użyj klasy do konserwacji kodu. Nie martw się o wydajność, chyba że POTRZEBUJESZ. –

Odpowiedz

2

Jaką wersję Java używasz? Co robisz z tymi parametrami? Może być lepiej przesuwając DAO do przodu na liście argumentów, a następnie za pomocą varargs zdać jednak wiele int s chcesz:

calculateFinalInvoice(InvoiceDO invoiceDO, int args...) { 
} 
+0

Używam java 1.6 – John

+0

W kodzie jest literówka. Powinien być obliczony FakturaFinalna (FakturaDo invoiceDO, int ... argument) {} –

0

można po prostu przekazać tablicę int

calculateFinalInvoice(int[] values, InvoiceDO invoiceDO) { } 
+0

Dowolne, jak chcę, aby Thiese w mojej warstwie usługowej – John

+0

@sorry nie dostałeś .. czy jest jakikolwiek problem z przekazywaniem tablicy int? – stinepike

+0

Tak, jest to również możliwe. Czy wydajność może być wydajna? – John

1

Do nie martw się o mikro zarządzanie wydajnością na takie rzeczy. Kod dla jasności i po zakończeniu kodowania, w razie potrzeby martw się o wydajność. W takim przypadku możesz przemyśleć swój projekt i stworzyć więcej struktury kodu. Na przykład możesz użyć tablic:

public void calcualteFinalInvoices(int [] invoices, InvoiceDO action){ 
    //... 
} 
0

Zapomnij o wydajności. To nie jest problem. Problem polega na tym, że dokładnie tak, jak formuła inżyniera nie może przekraczać 1 cala, metoda nie powinna mieć więcej niż 3 argumenty. Jeśli potrzebujesz więcej, zmień swój projekt.

Prawdopodobnie powinieneś utworzyć specjalną klasę parametrów i przekazać jej instancję do metody. Lub umieść metodę w innej klasie, która przechowuje pewne dane jako pola instancji ...

Jeśli chcesz doradzić w sprawie rozwiązania swojego projektu, zadaj inne pytanie, gdzie wyjaśnić, co próbujesz zrobić. Wierzę, że społeczność może pomóc ci ulepszyć Twój projekt.

+0

Głupie zasady są głupie. Możliwe jest znalezienie klastrów powiązanych parametrów i przekazanie ich jako obiektów. Jednak każde takie tworzenie obiektu będzie musiało być wolniejsze niż samo przekazywanie parametrów. –

+0

Dziękuję. – John

+1

Drodzy @Bob Dalgleish, głupie zasady pomocy. Czy podoba Ci się metoda, która akceptuje 10 argumentów? Czy są one wygodne? Czy są łatwe w użyciu? Pomyśl o tym. – AlexR

1

Ośmielę się dać bardziej OOP, bardziej czytelne podejście.

Twój przykładowy kod przypomina połączenie trim("my string") zamiast "my string".trim(). Jest to programowanie proceduralne, w którym kod działa na dane pasywne (trim działające na "my string"). W OOP zamiast tego wysyłamy wiadomości do obiektów, aby spełnić żądania, np. W "my string".trim()".

Tak więc alternatywa określa Invoice jako koncepcję, o którą można poprosić o jej wartość lub zawartość. Następnie używamy method chaining i encapsulation, aby uzyskać najbardziej czytelny i najlepiej obsługiwany program. Jeśli różne zmienne mają specjalne znaczenie, możesz ozdobić klasę Invoice specyficznymi wersjami add, takimi jak addBalance i tak dalej.

class Invoice { 
    private final List<Integer> values = new ArrayList<Integer>(); 

    public Invoice add(int value) { 
     values.add(value); 
     return this; 
    } 

    public double value() { 
     // Use the values to compute the final invoice. 
     return computedFinalInvoice; 
    } 
} 

Zastosowanie tak:

double finalInvoiceValue = new Invoice() 
    .add(1) 
    .add(2) 
    .add(100) 
    .value(); 
Powiązane problemy