Здравствуйте, сообщество переполнения стека. В настоящее время я работаю над приложением Android VoIP, которое использует WebRTC, и поэтому я пытался понять исходный код, который я нашел на GitHub. До сих пор мне удавалось воспроизвести и понять часть найденного мной исходного кода, но сейчас я наткнулся на проблему с реализацией SignalingClient. Чтобы лучше понять мою проблему, я думаю, что уместно быть более подробным и задать вопрос более точно:
Как получить доступ ко всем членам в текущей активности, не объявляя ее объект из class через один метод экземпляра, который определен в том же другом классе?
Я думаю, что указание на него в исходном коде также полезно для понимания вопроса. Я сократил код, чтобы он максимально соответствовал вопросу.
class SignallingClient {
private static SignallingClient instance;
private String roomName = null;
private Socket socket;
boolean isChannelReady = false;
boolean isInitiator = false;
boolean isStarted = false;
private SignalingInterface callback;
...
public static SignallingClient getInstance() {
if (instance == null) {
instance = new SignallingClient();
}
if (instance.roomName == null) {
//set the room name here
instance.roomName = "vivek17";
}
return instance;
}
public void init(SignalingInterface signalingInterface) {
...
}
...
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener, SignallingClient.SignalingInterface {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO}, ALL_PERMISSIONS_CODE);
} else {
// all permissions already granted
start();
}
}
...
public void start() {
// keep screen on
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
initViews();
initVideos();
getIceServers();
SignallingClient.getInstance().init(this); //Here is my lack of understanding/reproducing/comprehending,
//because at this point I have access to all members(variables)
//in the SignalingClient.java class : boolean isChannelReady,
//boolean isInitiator, boolean isStarted
//and also other methods which are public...
//Shouldnt it be like this?
/*
SignalingClient obj = new SignalingClient();
obj.getInstance();
obj.init(this);
*/
...
}
...
}
После экспериментов и поиска в Интернете [1][2][3][4] и многие другие вопросы, связанные с переполнением стека. Я заметил, что это поведение как-то связано с static модификатор согласно этим источникам [5][6][7], но и тот факт, что
class SignallingClient{... //SignallingClient
private static SignallingClient instance;... //SignallingClient
public static SignallingClient getInstance() {... //SignallingClient
класс, элемент экземпляр, а также метод getInstance имеют/имеют одно и то же "имя", как мы можем видеть в комментариях к строке выше. . Возвращаясь к моему вопросу, я действительно хотел бы знать, как это работает, или это трюк для доступа ко всем возможным членам и методам (и другим вещам, которых я еще не знаю) без объявления объекта. Я был бы очень признателен за любой ответ, за которым следует хорошее объяснение этой темы, а также за добавление некоторых хороших источников/учебников/университетских сценариев и т. д., где я могу прочитать об этом. Большое спасибо.