2013-08-12 19 views
6

Jeśli mam 2 konstruktory w mojej klasie niestandardowej, a jedna z nich przyjmuje dodatkowy argument i robi wszystko, co pierwsze, ale z tylko jedną dodatkową linią kodu (i ta dodatkowa linia wykorzystuje dodatkowy argument), jak najlepiej sobie z tym poradzić bez konieczności duplikowania całego kodu w pierwszym konstruktorze?Jak radzić sobie z 2 prawie identycznymi konstruktorami?

Przykład kodu

public myConstuctor(int number, int number2){ 

    int result = (number + number2); 
    int result2 = (number2 - number1) 

    //Etc 
    //Etc 
    //Etc 
    //Etc 

} 

public myConstructor(int number1, int number2, int number 3){ 

    int result = (number + number2); 
    int result2 = (number2 - number1) 

    //Etc 
    //Etc 
    //Etc 
    //Etc 

    int result3 = (result + result2 + number3) 


} 
+0

Nie, to nie to samo pytanie, nie pytam konkretnie, jak wywołać jednego konstruktora z innego, pytam jak poradzić sobie z problemem obcinania duplikatu kodu, niezależnie od najbardziej popularnej odpowiedzi bycie właśnie to (zadzwoń do jednego konstruktora z drugiego) – Zippy

+0

"Pytam, jak sobie poradzić z problemem obcinania duplikatu kodu", wybrałeś jako poprawną, a nie poprawną odpowiedź. Lepiej wprowadzić logikę konstruktor z większą liczbą parametrów – nachokk

+0

@nachokk, Jeśli utworzę obiekt, który wymaga tylko 1 argumentu, to nie potrzebuje kodu w konstruktorze 2-argumentowym, więc większość mojej logiki (cała wspólna logika) znajduje się w konstruktorze z * najmniejsze * argumenty, kiedy potrzebuję utworzyć obiekt przechodzący 2 argumenty, wtedy cała logika w oryginalnym konstruktorze 1-argumentowym nadal będzie musiała być uruchamiana, jak to często bywa wszystkie obiekty tego typu, ale będą potrzebowały dodatkowego kodu w konstruktorze 2-argumentowym, odwołuję się do konstruktora 1-argumentowego i uruchamiam wspólny kod, a następnie uruchamiam dodatkowy kod w drugim. Wydaje się być całkowicie logiczne? – Zippy

Odpowiedz

14

Można zrobić drugie połączenie konstruktora pierwszego One:

public MyClass(int number1, int number2, int number3) { 
    this(number1, number2); 
+0

mmm nie wiem, dlaczego 5 przegranych, @bas odpowiedź jest poprawna – nachokk

+0

Perfect. wdrożone i działa świetnie :-) – Zippy

+1

@nachokk: Obie odpowiedzi są poprawne. Generalnie wolę, aby konstruktory z mniejszą liczbą argumentów wywoływały te z większymi argumentami. Przypadek op przedstawiony jest w sposób sugerujący, że takie zamówienie może nie być możliwe, dlatego SLaks podjął bezpieczną trasę i przedstawił odpowiedź, która bardziej odpowiadała kodowi PO. Jeśli nie ma możliwej wartości domyślnej dla liczby 3, odpowiedź basowa nie jest opcją (chyba, że ​​dodasz wartość wartownika lub sprawisz, że numer 3 będzie nullable). Niektórzy twierdzą, że podejście SLaksa jest czystsze, ponieważ tworzy wiele małych konstruktorów, a nie jeden gigantyczny). – Brian

13

można wywołać inny konstruktor i umieścić wszystkie logiki tam.

public myConstructor(int number, int number2){ 
    this(number, number2, 0); 
} 

public myConstructor(int number1, int number2, int number3){ 

    int result = (number + number2); 
    int result2 = (number2 - number1) 

    //Etc 
    //Etc 
    //Etc 
    //Etc 

    int result3 = (result + result2 + number3) 


} 
+0

Co jeśli liczba3 zwielokrotnia jakąś wartość? Powiedz "result2 * = number3'? – Math

+0

W zależności od struktury konstruktorów, odpowiedź SLaks może być lepsza. Podejście to oznacza, że ​​użytkownik mógł nazwać 'myConstructor' z 3 argumentami, ale zamiast tego domyślny argument jest używany dla number3. @Math w twoim przypadku domyślnym wywołaniem może być 'this (number, number2, 1);' – bas

+2

Powiedziałem to, ponieważ myślę, że twoje rozwiązanie będzie zależało od tego, co robi konstruktor, i odpowiedź Slaksa wydaje mi się, że obejmuje wszystkie możliwości .. Nie to, że twoje jest złe, ale zależy od tego, co robi konstruktor. – Math

6

Można również użyć wzorca budowniczy jeśli argumenty zbyt wiele do zarządzania:

MyClass obj = Myclass.set1(number1).setN2(number2).setN3(number3).build(); 

build() puszka zadzwoń do uciążliwych konstruktorów.

+0

+1 lepszy sposób podejścia niż użycie 2 konstruktorów –

+0

To jest wzorzec projektowy Buildera i jest właściwy sposób użycia. – BVMR

+0

Dzięki za to @rocketboy, to jest interesujące. Mam tylko maksymalnie 2 argumenty w mojej faktycznej klasie (1 konstruktor argumentu i 2 konstruktor argumentów), więc zamierzam użyć odpowiedzi SLacks, ale dzięki, zagłębię się w to! – Zippy

0

Po prostu użyj pierwszej metody konstruktora w metodzie drugiego konstruktora, a następnie ... po prostu dodaj nową linię potrzebną w metodzie Drugi konstruktor.

public ClassName(arg1, arg2){ 
    //etc 
} 


public ClassName(arg1,arg2,arg3){ 
this(arg1,arg2); 
//new line of code to deal with arg3; 
} 

I to jest :) mnóstwo zaoszczędzonego czasu.

+1

Nie można mieć konstruktorów z różnymi _names_. Muszą pasować do nazwy klasy. – jlordo

+0

Wow poważnie wow XD –

+0

"KLASA NAZWĄ" nie przestrzega najlepszych zasad dotyczących nazewnictwa. Powinien być 'ClassName' – Math