Я программировал Java в течение последних двух месяцев, но я опытный программист на python и C. Я знаю, что из-за этого я делаю ошибки.Java Singleton + внутренний класс missunderstand
Я прихожу к этому вопросу для очистки предупреждений моего проекта в студии Android.
Я использую класс Singleton с внутренними классами, чтобы сохранить все параметры конфигурации в одном месте и разрешить всем другим классам доступ к нему с необходимостью передачи конфигурации.
Вот основной код моего Singleton
public class syscfg {
public List<CommData> Commlist;
public static CommConfigIP4 MyCommConfig;// = new CommConfig();
private static syscfg instance = null;
private static boolean ConfigStat = false;
/** JAVA singleton control methods**/
protected syscfg(){
// pues eso
if(ConfigStat == false){
Log.i("SD_app_log", "SYSCFG: Module Initialization");
ConfigStat = true;
MyCommConfig = new CommConfigIP4();
init_config();
}else{
Log.i("SD_app_log", "SYSCFG: Module Loaded");
}
}
public static syscfg getInstance(){
if(instance == null){
instance = new syscfg();
}
return instance;
}
public class CommConfigIP4{
public int discoveryPort = 30303;
public byte[] MyMAC;
public String MyType = "";
public String MyIP;
public byte[] getIPbytearray(){
// byte[] IPout= new byte[4];
try{
byte[] IPout = (InetAddress.getByName(MyIP)).getAddress();
return IPout;
}catch (Exception e){
return null;
}
}
В моей связи Java файл/класс у меня есть:
public class Communications {
private syscfg CFid ;
...
public Communications(Context ctx){
...
CFid = syscfg.getInstance();
init_comms(); //init_comms calls whoami
}
private void whoami(){
...
CFid.MyCommConfig.MyType = netint.getName();
...
}
}
Так, когда я первый имел все элементы (переменные, классы и методы) в syscfg, поскольку статическая студия Android показала предупреждение о том, что статический член получил доступ через ссылку на экземпляр. После некоторых исследований и документации я нашел рекомендацию не использовать статические переменные и методы, и я попытался их устранить. Но тогда я получаю ошибку nullpointexception в
CFid.MyCommConfig.MyType = netint.getName();
С отладчиком я обнаружил, что CFid.MyCommConfig = null
Я использую синглтон, чтобы избежать использования статического класса на syscfg и доступ через конкретизацию и не используя имя класса.
Теперь мои одноплодные коды как один размещено здесь с CommConfigIP4 статическими, и я еще раз, что мне посоветовать, используя быть_наст предупреждения:
syscfg.MyCommConfig.MyType = netint.getName();
вместо того, чтобы использовать экземпляр Acces-де-конфигурации.
Что здесь происходит? Что мне не хватает?
Спасибо, Гильермо
Синглтон - плохая идея. Google упорно трудился, чтобы изгнать их из их кода. Вы тоже должны. https://code.google.com/p/google-singleton-detector/ – duffymo
Этот класс не Singleton: а также отсутствие синхронизации в заводском методе, класс в любом пакете может расширить его, так что вы можете 't контролировать, кто его создает. –
Вы также должны использовать соглашения об именах Java: ClassesLikeThis, variablesLikeThis, STATIC_CONSTANTS_LIKE_THIS. Трудно следовать этому коде как есть. –