Czytelne użycie konstruktorów przeciążonych i rekursyjnych

Czytelne użycie konstruktorów przeciążonych i rekursyjnych
KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1683
0

Hej czy to jest czytelne tak tego używać czy lepiej za każdym razem w każdym konstruktorze pisać this.name = name itd... ? Tak wiem do jakiego gatunku należy to pytanie, ale zależy mi na czytelności kodu.

Kopiuj
package model;

public class Student {
	private String name;
	private String nickname;
	private int age = -1;
	private int id = -1;

	public Student(String name) {
		this(name,"");
	}

	public Student(String name, String nickname) {
		this(name,nickname,-1);
	}
	
	public Student(String name, String nickname, int age) {
		this(name,nickname,age,-1);
	}
	
	public Student(String name, String nickname, int age, int id) {
		this.name = name;
		this.nickname = nickname;
		this.age = age;
		this.id = id;
	}
}
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0
```java public class Student { private String name; private String nickname; private int age; private int id;

public Student(String name,String nickname="",int age=-1,int id=-1)
{
this.name=name;
this.nickname=nickname;
this.age=age;
this.id=id;
}
}

Kopiuj
</del> Coś mi się pochrzaniło dziś :)
http://stackoverflow.com/questions/997482/does-java-support-default-parameter-values
KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1683
0

@_13th_Dragon to byłoby super, ale

Kopiuj
Error:(8, 51) java: ')' expected
Error:(8, 52) java: illegal start of type
Error:(8, 54) java: <identifier> expected
Error:(8, 55) java: ';' expected
Error:(8, 62) java: <identifier> expected
Error:(8, 66) java: <identifier> expected
Error:(8, 72) java: <identifier> expected
Error:(8, 75) java: ';' expected

w IntellijIdea mam ustawione SDK 1.7 a Project language level: 6.0

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Zawsze możesz zrobić tak:

Kopiuj
public class Student
  {
   private String name;
   private String nickname;
   private int age;
   private int id;
 
   public Student(String name) { this(name,""); }
   public Student(String name,String nickname) { this(name,nickname,-1); }
   public Student(String name,String nickname,int age) { this(name,nickname,age,-1); }
   public Student(String name,String nickname,int age,int id)
     {
      this.name=name;
      this.nickname=nickname;
      this.age=age;
      this.id=id;
     }
  }

to już nie ma prawa nie zadziałać.

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
3

Mozesz tez uzyc buildera, zeby wygladalo cos jak:

Kopiuj
Student student = new StudentBuilder().withName("asd").withNickname("asd").withAge(12).build();

A samego studenta zrobic immutable.

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
2

Możesz też użyć starego sposobu znanego z Turbo Pascal (Turbo Vision), tj. goły konstruktor + settery + init:

Kopiuj
public class Student
  {
   private String name;
   private String nickname;
   private int age;
   private int id;
 
   public Student() { }

   public setName(String name) { this.name = name; }
   public setNickName(String nickname) { this.nickname = nickname; }
   public setAge(int age) { this.age = age; }
   public setId(int id) { this.id = id; }
  
   public init() {
   // wykonaj to co miał robić konstruktor po przypisaniu pol
   }
  }

Student student = new Student();
student.setName("Tomasz");
student.setAge(12);
student.init();

Plusy takiego rozwiązania:

  • przydatne w językach w których konstruktory nie obsługują wywoływania metod wirtualnych (nie mam pewności jak to jest w Javie).
  • pola możesz ustawiać w dowolnej kolejności (przy domyślnych wartościach parametrów: nie, przy przeciążanych konstruktorach: dużo roboty)

Minusy:

  • zalecane jest dodatkowe pole "bool initialized" wypełniane przez init i sprawdzane w metodach (niewydajne, dodatkowa robota)

Rozwiązanie by _13th_Dragon jest podstawowym rozwiązaniem, zalecanym w książkach do nauki Javy.
Rozwiązanie by n0name_l wygląda na najlepsze dla Javy.

Edit: tutaj jest rozwinięcie opisu do wersji z builderem:
http://javarevealed.wordpress.com/2013/08/12/builder-design-pattern/

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Zastanawiam się jeszcze nad czymś podobnym do tego co podał @n0name_l, czyli:

Kopiuj
public class Student
  {
   private String name;
   private String nickname="";
   private int age=-1;
   private int id=-1;
 
   public Student(String name) { this.name=name; }
   public Student withNickName(String nickname) { this.nickname=nickname; return this; }
   public Student withAge(int age) { this.age=age; return this; }
   public Student withId(int id) { this.id=id; return this; }
  }
//tworzenie:
Student s=new Student(name).withNickname("asd").withAge(12).withId(352345);

Za mało działam w Jave aby mieć szansę ocenić takie podejście.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.