Niezrozumiały dla mnie zapis

0

Mam taki kod

 public class Solution {
    private static int B;
    private static int H;
    private static boolean flag;

    static {
        Scanner scanner = new Scanner(System.in);
        B = scanner.nextInt();
        H = scanner.nextInt();
        if(moreThanZero(B, H)) {
            flag = true;
        } else {
            System.out.println("java.lang.Exception: Breadth and height must be positive");
        }
    }

    private static boolean moreThanZero(int b2, int h2) {
        return b2 > 0 && h2 > 0;
    }

    public static void main(String[] args){
        if(flag){
            int area=B*H;
            System.out.print(area);
        }

    }
}

W jaki sposób działa ta część kodu

 static {
        //////////////
    }

nawet nie wiem jak ją nazwać. Kompletnie nie wiem co oznacza taki zapis.

0

Kod zawarty w sekcji static jest wykonywany jednokrotnie, przy inicjalizacji klasy; niezależnie od tego, ile jej instancji powstanie.

0

Jak taka konstrukcja ma się do konstruktora? jest wywoływana przed czy po? Nie programuje w javie - ale jak widać mnie też taka konstrukcja zdziwiła. A podany przez OP kod chyba nie powinien robić tego co robi - mając na względzie wyjaśnienie @Althorion

0

@axelbest nijak sie ma bo konstruktor jest wołany kiedy tworzysz obiekt danej klasy a blok statycznej inicjalizacji kiedy twrzona jest klasa.

Na przykładzie krzeseł, konstruktor jest związany z montowaniem konkretnego krzesła, a statyczna inicjalizacja z rysowaniem planów krzesła.

3

W C# byłby to statyczny konstruktor, wywoływany raz przed pierwszym użyciem takiej klasy (po załadowaniu assembly).

Kod, który analizujesz, jest tragiczny:

  • statyczne "pola" klasy;
  • beznadziejnie, bo nic niemówiące nazwy (H, B, flag);
  • beznadziejne, bo niekonsekwentne nazwy (raz z małej, raz z dużej litery, raz jednoliterowe, raz jednowyrazowe, raz opisowe);
  • wczytywanie danych od użytkownika w konstruktorze i to jeszcze statycznym;
  • użycie statycznego konstruktora tam, gdzie nie jest potrzebny;
  • udawanie rzucenia wyjątku (System.out.println("java.lang.Exception: Breadth and height must be positive");), przez co potrzebna jest dodatkowa flaga, a przecież wystarczyłoby faktycznie rzucić taki wyjątek;
  • łamana angielszczyzna ("width must be positive" - wysokość musi być pozytywna? moreThanZero - więcej niż zero? chyba raczej areGreaterThanZero. Breadth - aż musiałem w słowniku sprawdzić - to akurat świadczy o moim ubogim angielskim - bo normalnie jako słowa szerokość używa się słowa width);
  • if(moreThanZero(B, H)) flag = true; - poleganie na niezainicjowanych wartościach: jeśli ten potworek moreThanZero zwróci false, to quasimodo flag będzie mieć wartość domyślną, nie masz gwarancji, że będzie nią false;
  • argumenty funkcji moreThanZero(int b2, int h2) to jakaś literówka, po pierwsze "pola" klasy nazywają się B i H, więc można zadeklarować zmienne b i h, bo java jest case sensitive, po drugie dlaczego nie width i height, po trzecie skoro funkcja służy tylko do walidacji tych wartości, to powinna się nazywać validateWidthAndHeight (albo coś w tym stylu) i nie powinna przyjmować argumentów, bo te już zostały wczytane do "pól" klasy;
  • taki kod jest niemal niemożliwy do przykrycia testem jednostkowym.

Nie patrz na ten kod, a już na pewno nie ucz się na nim programować. Możesz zobaczyć na nim, jak programować się nie powinno.

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