Лучший способ сделать это - обеспечить доступ к общему состоянию приложения через методы интерфейса, затем создать реализующий класс, содержащий переменные, и передать этот экземпляр класса другим классам во время конструирования (которые они принимают какэкземпляр интерфейса).
Это лучше, чем использование статического класса или синглтона, так как позволяет макетировать функциональность общего состояния для тестирования, улучшает общее повторное использование кода и позволяет изменять реализациюи настройка общего состояния без влияния на какой-либо код, использующий его.
Например,
// Session interface for all application shared state.
public interface ApplicationSession
{
public int getMaxUserLimit();
}
// A backing for the interface (simple in memory version, maybe future versions use a database, who knows).
public class SomeApplicationSession implements ApplicationSession
{
private volatile int maxUserLimit = 0;
public void setMaxUserLimit(int limit) { this.maxUserLimit = limit; }
public int getMaxUserLimit() { return maxUserLimit; }
}
// ClassA uses the supplied session.
public class MyClassA
{
private ApplicationSession session;
public myClassA(ApplicationSession session)
{
this.session = session;
}
}
// usage...
public class MyMain
{
public static void main(String[] args)
{
// Create / get session (ultimately possibly from a factory).
ApplicationSession session = new SomeApplicationSession();
ClassA myClassA = new ClassA(session);
// do stuff..
}
}