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

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?

0

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

0

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

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.

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/questions/19058766/java-static-initialization-order
https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

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.

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?

0

Dzięki Wibowit, bardzo wartościowy post.

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
}

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