Czy istnieje metoda, inna niż za pomocą statycznych metod fabrycznych lub wzorców konstruktora, do obsługi domyślnych parametrów konstruktora typu tablica?
tu toczy się wiele owocnych dyskusji na temat tego, jak to zrobić za pomocą wzorców konstruktora i statyczne metody fabryczne i istnieje wiele innych przykładów obsługi różnych konstruktorów o różnej liczbie parametrów, ale wszystkie te wzorce wydają się zawierać tylko parametry prostego typu (np. int, double itp.), których nie mam problem z dostaniem się do pracy. Próbuję mieć domyślny parametr tablicy typu i nie mogę tego osiągnąć za pomocą standardowej konfiguracji konstruktora.
Wypróbował kilka podejść do tego i wszystkie skutkują jakimś błędem, więc szukam alternatywy, wciąż wykorzystując wzorzec konstruktora. Pierwsze podejście:
public class MyClass{
double[] mWeights;
public MyClass(){
double[] weights = {1, 1, 1}
this(weights);
}
public MyClass(double[] weights){
this.mWeights = weights
}
}
Ale to powoduje błąd:
Wywołanie „this ()” musi być pierwszą instrukcją w treści konstruktora
Alternatywnie próbowałem:
public class MyClass{
double[] mWeights = new double[] {1, 1, 1};
public ActionDistribution(){
this(mWeights);
}
public ActionDistribution(double[] weights){
this.mWeights = weights;
}
}
Ale to powoduje błąd:
Nie można odwołać się do „MyClass.mWeights” przed wywołaniem konstruktora typu supertype.
Na koniec próbowałem:
public class MyClass{
double[] Mweights;
public ActionDistribution(){
this({1, 1, 1});
}
public ActionDistribution(double[] weights){
this.mWeights = weights;
}
}
Ale to powoduje błąd:
Inicjator tablicy nie jest tutaj dozwolony
Jakieś pomysły, jak mogę skonfigurować konstruktor do obsługi domyślnej tablicy bez użycia statycznych metod fabrycznych lub wzorców konstruktora? Dodatkowe punkty, jeśli masz rozwiązanie, które działa dla dowolnego typu ogólnego (a nie tylko tablic), a jeszcze więcej punktów za wyjaśnienie, dlaczego jest to możliwe w przypadku prostszych typów danych, a nie tablic.
Edycja: Jeśli nie jest to jasne, w działającej formie powyższego kodu mam nadzieję, że później zadzwonię
MyClass myClass = new MyClass();
I daje w wyniku obiekt myClass z polem myClass.mWeights
o wartości {1, 1, 1}
3 odpowiedzi
Najprawdopodobniej chcesz użyć składni new double[] { ... }
:
class MyClass{
public MyClass(){
this(new double[] { 1, 1, 1});
}
public MyClass(double[] weights){
this.mWeights = weights;
}
}
Składnia tworzenia tablicy jest wyjaśniona w §JLS 15.10.1. Wyrażenia tworzenia tablicy. Zgodnie z § 10.6. Inicjatory tablicy:
Inicjator tablicy można określić w deklaracji pola (§8.3, §9.3) lub deklaracji zmiennej lokalnej (§14.4) lub jako część wyrażenia tworzenia tablicy (§15.10.1), aby utworzyć tablicę i podać pewne wartości początkowe .
W twoim przypadku nie przypisujesz pola ani zmiennej lokalnej, więc nie możesz użyć skrótu inicjatora tablicy. Parametry metody (i konstruktora) wymagają pełnej składni tworzenia tablicy.
Możesz także użyć ... składni:
public class MyClass {
double[] mWeights;
public MyClass(double... mWeights) {
mWeights = mWeights;
}
public MyClass(){
this(1, 2, 3);
}
}
public MyClass(double... mWeights1, double... mWeights2)
zwróci błąd związany z cytowaną dokumentacją varargs. public MyClass(double... mWeights1, mWeights2)
a nie public MyClass(double... {mWeights1, mWeights2})
również działają. Jakieś linki do dokumentu uogólniającego składnię wielokropka?
Możesz po prostu użyć drugiego podejścia i zamiast tego pozostawić swój konstruktor pusty:
public class MyClass {
double[] mWeights = new double[] {1, 1, 1};
public ActionDistribution(){}
public ActionDistribution(double[] weights){
this.mWeights = weights;
}
}
Inicjalizacja klasy za pomocą domyślnego pustego konstruktora pozostawi wagi, jakie zostały zainicjowane w polu Class za pomocą {1, 1, 1}
.
mWeights
, która zostanie odrzucona przez konstruktor double[]
. Być może JVM jest wystarczająco sprytny, aby zoptymalizować ten przypadek użycia, ale wydaje się niechlujny.
Podobne pytania
Powiązane pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].
this()
. Ma sens, ale może to ma więcej sensu z punktu widzenia czytelności? Zwłaszcza jeśli zamierzasz mieć więcej niż jeden parametr.