Java: Las mejores prácticas para compartir la localización de objetos a través de muchos objetos GUI?

StackOverflow https://stackoverflow.com/questions/2350735

Pregunta

¿Cuál sería la mejor práctica para compartir la localización de objetos (en este caso ResourceBundle, donde hago Guardar todas las traducciones) a través de muchos objetos GUI de aplicación? Tengo algunas ideas, pero ambos tienen inconvenientes:

1) que pasa a través de ResourceBundle cada constructor de la clase GUI, pero entonces necesario guardarlo dentro de cada clase (para su uso posterior) - medios que tienen el mismo código en cada clase una y otra vez

2) Declarar ResourceBundle como static (pero no definitivo, porque puede que tenga que cambiarlo - por ejemplo, el lenguaje cambiado) en la clase principal de la GUI (por ejemplo, "ResourceBundle msg public static"), y más tarde acceder siempre a través de ella (por ejemplo, llamando MainGuiClass.msg.getString ( "algo")), pero también puede ser modificado / destruido por cualquier otra clase de interfaz gráfica de usuario en el mismo paquete ...

Tal vez hay algunas mejores prácticas para hacer el intercambio?

Gracias.

¿Fue útil?

Solución

El objeto ResourceBundle global no puede ser definitiva, sino que debe ser almacenado en caché en un mapa. El cambio de idioma no requiere cambiar esta referencia:

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

public class UIBundle {
    private static final Map<Locale, ResourceBundle> allUIResources = new HashMap<Locale, ResourceBundle>();

    public static String getString(final String key) {
        return getString(key, Locale.getDefault());
    }

    public static String getString(final String key, final Locale locale) {
        ResourceBundle rb = allUIResources.get(locale);
        if (rb == null) {
            rb = ResourceBundle.getBundle("my-ui-resource", locale);
            allUIResources.put(locale, rb);
        }
        return rb.getString(key);
    }

}

Con este código puede o bien textos de acceso en idiomas / o lugares específicos sólo tiene que utilizar la configuración regional predeterminada. Si desea cambiar la configuración regional, acaba de establecer la configuración regional predeterminada. Su interfaz de usuario necesita saber acerca de los cambios de entorno local, por lo que puede que tenga que introducir un poco de interfaz de procesador de todos los componentes de la interfaz de usuario ( PropertyChangeListener , PropertyChangeSupport ) y no cambia la configuración regional directamente.

Otros consejos

Se podría aplicar una fábrica de almacenamiento en caché, que devuelve el ResourceBundle basado en el valor de un parámetro de configuración regional de entrada. En la primera llamada ResourceBundle se construirá y luego almacenado en caché en una referencia estática, que posteriormente puede ser devuelto y reutilizado en posteriores llamadas a la fábrica.

Si usted está preocupado acerca de otras clases de hacer las cosas que no desea a un objeto, lo convierten en un campo protegido / privada de una clase que tiene los métodos que desea que se realicen en él.

Globals son malos, pero a veces su conveniencia es mayor que su maldad.

Los implementos ResourceBundle clase ya una memoria caché, lo que no hay necesidad de implementar el almacenamiento en caché a sí mismo. Su clase de acceso se puede implementar como producto único. Para cambiar el idioma de uso un ThreadLocal para la localidad:

public final class ThreadLocale extends ThreadLocal<Locale>
{
    public static final ThreadLocale theInstance = new ThreadLocale ();

    private ThreadLocale () 
    {
        super ();
    }

    protected Locale initialValue()
    {
        return Locale.getDefault ();
    }
}

En el método de la clase de acceso, que recibe el texto del recurso haz utilizo la configuración regional del subproceso actual:

public synchronized String getMessage (Object messageKey, Locale locale) throws MissingResourceException
{
    ResourceBundle resourceBundle = null;
    resourceBundle = ResourceBundle.getBundle (filename, ThreadLocale.theInstance.get ());
    return resourceBundle.getString (messageKey.toString ());
}

Así se puede establecer una configuración regional para cada hilo y no globalmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top