Argumenty w metodzie - skrócenie

0

Czy da się w jakiś sposób sprawdzić czy zostały przekazane argumenty do metody, ilość tych argumentów i jeśli tak to jakie?

Prosty przykład:

public BufferedImage getSprite(int animationIndex) {
    return sprite[animationIndex];
}

vs

public BufferedImage getSprite() {
    return sprite[0];
}

i powiedzmy, że chciałbym otrzymać coś takiego:

 public BufferedImage getSprite(int animationIndex) {
     if(licznikArgumentów() > 0) {
         System.out.println("ok");
     }
 
     int index = animationIndex || 0;
     return sprite[index];
 }

Czy są jeszcze jakieś pokrewne tematy, które mogą się okazać pomocne w tej i podobnych sytuacjach?

1

Z tego co zrozumiałem to potrzebujesz domyślnych wartości argumentów. Java nie ma domyślnych argumentów, w przeciwieństwie do Kotlina, C++, Pythona i innych języków.

Więc konstrukcja w stylu

public BufferedImage getSprite(int animationIndex = 0) {
    return sprite[animationIndex];
}

nie zadziała. Język tego nie wspiera.

Natomiast da się zrobić coś takiego:

public BufferedImage getSprite() {
    return getSprite(0);
}
public BufferedImage getSprite(int animationIndex) {
    return sprite[animationIndex];
}

Natomiast nawiązując do sposobu o którym myślałeś to jest coś takiego jak varags, które jest w zasadzie lukrem składniowym na tablice. Z tym że służy do przekazania N argumentów danego typu. W twoim przypadku jest 1 argument bądź zero argumentów, więc się to nie aplikuje.

1
marcyse napisał(a):
 public BufferedImage getSprite(int animationIndex) {
     if(licznikArgumentów() > 0) {
         System.out.println("ok");
     }
 
     int index = animationIndex || 0;
     return sprite[index];
 }

ten kod wygląda jakbyś z Perla przychodził lub z podobnego (dynamicznie typowanego) języka.
W Javie (która jest statycznie typowana) robi się to bardziej tak:

 public BufferedImage getSprite() {
     return getSprite(0);
 }

 public BufferedImage getSprite(int animationIndex) {
     return sprite[animationIndex];
 }

i potem możesz wywołać getSprite() lub getSprite(11)

W Scali gdzie są wartości domyslne dla parametrów można by napisać tak:

def getSprite(animationIndex: Int = 0) = sprite[animationIndex]

i i potem możesz wywołać getSprite() lub getSprite(11)

0

W przykładzie powyżej odpowiedzi są jak powyżej - użyj przeładowania metody.

marcyse napisał(a):

Czy da się w jakiś sposób sprawdzić czy zostały przekazane argumenty do metody, ilość tych argumentów i jeśli tak to jakie?

Odpowiadając jednak na zadane pytanie bez wchodzenia w szczegóły, można to zrobić na przykład w ten sposób:

public int getSprite(Object... args) {
   System.out.println("przekazano argumentow: " + args.length); // ilość argumentów
   for (Object arg : args)
      System.out.println(arg != null ? arg.getClass().getName() : "null"); // jeśli tak to jakie
   int index = args.length > 0 ? (int)args[0] : 0; // możesz sobie coś z nimi robić
   return index;
}

System.out.println(getSprite());
// przekazano argumentow: 0 
// 0

System.out.println(getSprite(10));
// przekazano argumentow: 1
// java.lang.Integer
// 10

System.out.println(getSprite(10, "abc", 4234.645));
// przekazano argumentow: 3
// java.lang.Integer
// java.lang.String
// java.lang.Double
// 10

Działa to tak że po prostu wszystkie argumenty zostaną przekazane jako zwykła tablica obiektów a z tablicą już możesz robić co chcesz.
Tak więc podsumowując proponuję zapomnieć o javie i przejść na kotlina

2

Dla małych liczb argumentów możesz przeciążać metody "teleskopowo" jak w przykładzie @arciobus . Jeżeli masz tych parametrów więcej to możesz je zapakować do pojedynczego obiektu i tworzyć go builderem:

MyMethodParams.builder(mandatory1, mandatory2)
.setOptional1(...)
.setOptional5(...)
.build()

Można tez (czasami) przestawić się na coś, co ma te parametry nazwane/defaultowe w składni języka https://kotlinlang.org/docs/functions.html#named-arguments

0
piotrpo napisał(a):

Dla małych liczb argumentów możesz przeciążać metody "teleskopowo" jak w przykładzie @arciobus . Jeżeli masz tych parametrów więcej to możesz je zapakować do pojedynczego obiektu i tworzyć go builderem:

Innym ciekawym sposobem (podobnie jak tu - nie na wszystkie okoliczności) jest wz. Kontekst (map sterowany typami)

1

Kolega każe nam sie gimnastykowac, przy czym jego własny przykład to ZALEDWIE pytanie zerojedynkowe, o istnienie / nieistnienie jedynego parametru.
Przeładowanie jest jedynym lekkim i naturalnie sie nasuwającym sposobem.

Wszystkie inne (w tym moja propozycja Kontekstu) są dalej idące, poza jawny zakres pytania

0

Dzięki javowcy, rozwiązaliście mój problem, a i ja dowiedziałem się czegoś o tym cudownym języku

1 użytkowników online, w tym zalogowanych: 0, gości: 1