@Ezekiel4
Охотник на пиратов и сборщик монолитов

Как избежать постоянных проверок на null при вызове java класса?

Собираю плагин для Unity. В процессе мне нужно обращаться к java классу. Ниже я привёл фрагмент кода. При каждом вызове я проверяю не пуста ли ссылка. Весь класс статический. Не вопрос добавить булево поле типа isInitialized и проверять, чё там, но что-то мне подсказывает, что могут быть сценарии, когда эта ссылка может стать null. Есть ли способы сделать код лучше (возможно и безопаснее)?

static AndroidJavaObject javaObject;
// ...
public static bool bluetoothEnabled {
	get => return javaObject != null ? javaObject.Call<bool>("IsBluetoothEnabled") : false;
	set {
		if (javaObject != null)
			javaObject.Call(value ? "EnableBluetooth" : "DisableBluetooth");
	}
}

public static void CreateServer(string uuid) {
	if (javaObject != null)
		javaObject.Call("CreateServer", uuid);
}
	 
public static void StopServer() {
	if (javaObject != null)
		javaObject.Call("StopServer");
}
	 
public static void Join(string uuid) {
	if (javaObject != null)
		javaObject.Call("Join", uuid);
}
		 
public static void Disconnect() {
	if (javaObject != null)
		javaObject.Call("Disconnect");
}

// и ещё куча вызовов, каждый из которых стопудово проверить, а не null ли всё-таки ссылка javaObject.


PS. напишите, если нужна какая дополнительная информация.
  • Вопрос задан
  • 91 просмотр
Решения вопроса 2
GavriKos
@GavriKos
Сделать 1 метод обертку, типа такого:

private static void Call(string name) 
{
if (javaObject != null)
javaObject.Call(name);
}


И вызывать его вместо javaObject.Call
Ответ написан
Комментировать
vabka
@vabka Куратор тега C#
Токсичный шарпист
Вариант 1:
Сделать метод EnsureInitialized, в котором будет проверка на null и инициализация, если всё-таки null.

Вариант 2:
Оставить проверку на null, но упростить код:
javaObject?.Call<bool>("IsBluetoothEnabled") ?? false


Вариант 3:
Убрать вообще нафиг этот static и сделать полноценную обёртку:
public class JavaObjectWrapper {
  private readonly JavaObject _javaObject;
  public JavaObjectWrapper() {
    _javaObject = new JavaObject(); // тут какая-то инициализация этого объекта
  }

  // Дальше у нас по идее должна быть гарантия, что он всегда не null/
  public void CreateServer(string uuid) {
    _javaObject.Call("CreateServer", uuid);
  }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AlexSku
не буду отвечать из-за модератора
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы