A co by było gdyby... :)

Odpowiedz Nowy wątek
Biały Mleczarz
2015-08-29 11:53
Biały Mleczarz
0

Tak...:)

class Main {

    public static void main(String[] args) {

        initProperties();
        ... 
        ...
        ...
    }

    private static void initProperties() {}

    public static Properties properties;
}

class Klasowa {

    public static final String string = properties.getProperty("property");
}

Myślałem, że zmienne statyczne, finalne są inicjalizowane zawsze jako pierwsze i taka operacja jest nie możliwa. Czy jest taka możliwość że program się wysypie?

Pozostało 580 znaków

Biały Mleczarz
2015-08-29 11:56
Biały Mleczarz
0

IDE mnie ostrzega(bardziej taki tip), że takich rzeczy raczej się nie robi...

Pozostało 580 znaków

Biały Mleczarz
2015-08-29 14:16
Biały Mleczarz
0

Nie wiem czy tak zostawić. Nie chciałbym żeby niefartem program mi się wysypał

Pozostało 580 znaków

2015-08-29 15:02

Rejestracja: 6 lat temu

Ostatnio: 3 lata temu

0

Wstawiłeś jakiś kawałek kodu z nieużywaną klasą i mainem, który wołą pustą metodę. Wstaw cały kod i napisz o co ci chodzi.

Pozostało 580 znaków

2015-08-29 15:28

Rejestracja: 5 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Hong Kong

0

posiadajac publiczna statyczna mutowalna skladowa prosisz sie o problemy, pozbadz sie tego public i static, bedziesz mial mniej gdybania :) o kolejnosci inicjalizacji skladowych - http://stackoverflow.com/ques[...]a-static-initialization-order
https://docs.oracle.com/javas[...]rial/java/javaOO/initial.html

Pozostało 580 znaków

2015-08-29 16:31

Rejestracja: 15 lat temu

Ostatnio: 9 minut temu

1

Myślałem, że zmienne statyczne, finalne są inicjalizowane zawsze jako pierwsze i taka operacja jest nie możliwa.

Pola statyczne i bloki oznaczone słówkiem static są inicjowane/ wykonywane przy ładowaniu klasy. Ładowanie klas w Javie jest leniwe - JVMka ładuje klasę dopiero, gdy jest potrzebna, czyli w momencie pierwszego użycia. Stąd kod podany przez ciebie może spokojnie działać.

Ładowanie klasy i tworzenie instancji obiektu danej klasy to dwie różne rzeczy. Żeby stworzyć instancję obiektu klasa musi być załadowana, ale do ładowania klasy nie trzeba tworzenia instancji obiektu - wystarczy odwołać się do statycznych pól i metod, czy też np do klasy bezpośrednio, w sensie np Klasa.class.toString().

Z powyższego wynika, iż podany przez ciebie kod może spokojnie działać, ale właśnie pod warunkiem, że pole properties zostanie zainicjalizowane właściwym obiektem zanim klasa Klasowa zacznie być ładowana.

To czy pole jest finalne nie ma znaczenia przy kolejności inicjalizacji.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit, 2015-08-29 16:32

Pozostało 580 znaków

Wielki Mleczarz
2015-08-29 16:42
Wielki Mleczarz
0

Nie mam pojęcia jak zrobić "ustawienia" do programu. Wymyśliłem tak, że po prostu przechowuje jakieś dane w pliku properties i potem je wczytuje przy starcie programu. Program wczytuje te wartośći tylko raz i one później się nie zmianiają - zmiana ustawień wymaga restartu.
Czy w tym przypadku też jest to nie bezpieczne?

Pozostało 580 znaków

Wielki Mleczarz
2015-08-29 16:44
Wielki Mleczarz
0

Dzięki Wibowit, bardzo wartościowy post.

Pozostało 580 znaków

2015-08-29 16:57

Rejestracja: 6 lat temu

Ostatnio: 3 lata temu

0

Zrób to obiektowo, nie na klasach i polach statycznych. Powiedz sobie, że masz zakaz używania słowa static, oprócz tego w funkcji main oczywiście. Zrób sobie klasę główną programu, klasę PropertiesLoader, ja bym to zrobił mniej więcej tak przy twoich założeniach, czyli zmiana ustawień wymaga restartu (w sumie dosyć duże ograniczenie, no ale jak chcesz :P):

class Main {
    public static void main(String[] args) {
        new Application();
    }
}
public class Application {
    private final Properties properties;

    public Application() {
        PropertiesLoader loader = new PropertiesLoader();
        this.properties = loader.readProperties();
    }
}
public class PropertiesLoader {
    public Properties readProperties() {  }
}
public Properties {
    // Tylko gettery, zrób tą klasę immutable
}
edytowany 1x, ostatnio: Wizzie, 2015-08-29 16:58

Pozostało 580 znaków

Odpowiedz

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