Pytanie do kogoś kto zna się na Javie (lub wzorcach projektowych).

Przyznam się bez bicia, że nie za wiele miałem okazji po programować w Javie. Stąd zastanawiam się, czy tak się robi, jak robię ja.

Chciałem w programie wykorzystać klasę ResourceBundle, jak wiemy, mniej więcej tak wygląda jej wykorzystanie:

Ja jednak chciałem uniknąć wklepywania z palca tych Stringów (parametrów metody getString, trochę dla wygody (dopełnienia w Eclipsie), trochę, żeby nie było błędów (literówek w nazwach).

Stworzyłem więc enuma (w końcu na Javie 1.6 – o pardon – 6.0, robię, a one nowością były w 5tce) nazwijmy go teksty:

Enum eTeksty {
	OkKey,
	CancelKey;
}

Dorobiłem do tego klasę, taką “nadbudówkę” (to się chyba ładnie dekorator nazywa) na klasę ResourceBundle, nazwę ją tutaj PobierzTekst:

public class PobierzTekst {
	private ResourceBundle resource;
 
	public PobierzTekst() {
		// Tutaj inicjowanie zmiennej resource - w normalny sposób, mamy potworzone w programie klasy obsługujące języki.
	}
 
	public String getTekst(eTeksty text) {
		try {
			return resource.getString(text.toString());
		}
		catch(...) {
			/*
				Tutaj w zależności od wypadku zwracam albo pusty tekst,
				albo krótką notkę np.: "[brak tekstu dla" + text.toString() + "]";
			*/
		}
	}
 
}

A w programie wykorzystanie tego wygląda następująco:

PobierzTekst myResources = new PobierzTekst();
button1 = new Button(myResources.getTekst(eTekst.OkKey));

Pytanie więc do osób, które się znają na Javie, czy to rozwiązanie jest w porządku? Czy zawsze będzie działać (np.: różne maszyny wirtualne różnie reagują na enumy) itp? Czy w ogóle, tak się robi, czy nie można prościej?

Jeszcze dopowiem, że mam też inne klasy zasobów, np.: z tekstami o błędach, do nich kolejnego enuma, i przeciążoną metodę getTekst.

6 thoughts on “Pytanie do kogoś kto zna się na Javie (lub wzorcach projektowych).

  1. Nawet ciekawy pomysł z tym enum..
    Można trochę uprościć:
    button1 = new Button(eTekst.OkKey.toString());

    wtedy w enumie trzeba nadpisać toString()
    Enum eTeksty {
    OkKey,
    CancelKey;
    @Override
    public String toString() {

    return resource.getString(name());

    }
    }

    resource powinien być tworzony poza enumem, a na pewno nie w jego konstruktorze 🙂

    Można jeszcze prościej przy użyciu gettexta, ale samo przygotowanie "infrastruktury" jest dość kłopotliwe 😉
    button1 = new Button(_("Jakiś tekst"));

    Like

  2. @up: resource jako singleton – hmm – ale za każdym razem trzeba by wklepywać to "toString()" – no pomysł ciekawy.Nie wiedziałem, że gettextto jest dostępne w Javie, ale tutaj mam ten sam problem którego chciałem uniknąć – wklepywanie stringów.Dzięki w każdym razie.

    Like

  3. > za każdym razem trzeba by wklepywać to "toString()"

    No chyba, że dodasz jeszcze jedną metodę o krótszej nazwie 😉

    Przy drugim sposobie nie wklepujesz keyów, które rzeczywiście łatwo pomieszać, tylko od razu ludzki tekst 🙂 Nawet jeśli zdarzy się jakaś pomyłka to łatwo ją wykryć podczas tłumaczenia..

    Like

  4. Keyów nie wklepuje, tylko wciskam Ctrl+Space, a jak się pomylę, to błąd wychodzi podczas parsowania (czy nawet od razu – podczas kolorowania składni przez Eclipsa).

    Like

  5. A nie można gdzieś stworzyć public static final Stringów ze wszystkimi -tekstami- nazwami kluczy i z nich korzystać? Będzie i dopełnianie w Eclipse i brak możliwości popełnienia literówki.

    Kurcze, textile nie włączone. "tekstami" jest przekreślone.

    Like

  6. @dandam

    Przypomniałem sobie, czemu użyłem enumów – bo mam kilka rodzajów klas zasobów, w zależności od tego, co przechowują i chciałem mieć jakieś rozróżnienie między nimi, żeby moja "nadbudówka" nie musiała sama zgadywać jakiej klasy używać (teraz mam przeciążone metody).

    Sorry, że tak późno, ale jak widać, z lekka dzisiaj zamotany jestem.

    Like

Comments are closed.