จะเข้าถึงสมาชิกและวิธีการทั้งหมดในกิจกรรมปัจจุบันด้วยวิธีอินสแตนซ์เดียวได้อย่างไร

สวัสดีชุมชน Stack Overflow ขณะนี้ฉันกำลังทำงานกับแอปพลิเคชัน Android VoIP ซึ่งใช้ WebRTC ดังนั้นฉันจึงพยายามทำความเข้าใจซอร์สโค้ดที่ฉันพบใน GitHub. จนถึงตอนนี้ ฉันสามารถทำซ้ำและเข้าใจซอร์สโค้ดที่พบได้เล็กน้อย แต่ตอนนี้ฉันพบปัญหาในการใช้งาน SignalingClient เพื่อทำความเข้าใจปัญหาของฉันเพิ่มเติม ฉันคิดว่าเป็นการเหมาะสมที่จะให้รายละเอียดมากขึ้นและถามคำถามให้ชัดเจนยิ่งขึ้น:

วิธีเข้าถึงสมาชิกทั้งหมดในกิจกรรมปัจจุบัน โดยไม่ต้องประกาศวัตถุประสงค์จาก โดยใช้วิธีหนึ่งอินสแตนซ์ซึ่งกำหนดไว้ในคลาสอื่นเดียวกัน

ฉันคิดว่าการชี้ไปที่ซอร์สโค้ดก็ดีที่จะเข้าใจคำถามเช่นกัน ฉันได้ย่อโค้ดให้สั้นลงเพื่อให้เหมาะกับคำถามที่ใกล้เคียงที่สุด

SignalingClient.java

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) {
...
 }
...
}

MainActivity.java

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] และคำถาม stackoverflow ที่เกี่ยวข้องอื่น ๆ อีกมากมาย ฉันสังเกตเห็นว่าพฤติกรรมนี้เกี่ยวข้องกับ คงที่ ตัวแก้ไขตามแหล่งที่มาเหล่านี้ [5][6][7] แต่ยังรวมถึงข้อเท็จจริงนั้นด้วย

class SignallingClient{...                        //SignallingClient
private static SignallingClient instance;...      //SignallingClient
public static SignallingClient getInstance() {... //SignallingClient

คลาส สมาชิก อินสแตนซ์ และเมธอด getInstance ล้วนมี/แชร์ "ชื่อ" เดียวกันกับที่เราเห็นในความคิดเห็นบรรทัดด้านบน . กลับมาที่คำถามของฉัน ฉันอยากจะรู้ว่ามันทำงานอย่างไร หรือถ้านี่เป็นเคล็ดลับในการเข้าถึงสมาชิกและวิธีการที่เป็นไปได้ทั้งหมด (และสิ่งอื่น ๆ ที่ฉันยังไม่รู้) โดยไม่ต้องประกาศวัตถุ ฉันขอขอบคุณคำตอบใด ๆ ตามด้วยคำอธิบายที่ดีเกี่ยวกับหัวข้อนี้ตลอดจนทิ้งแหล่งข้อมูล / บทช่วยสอน / สคริปต์มหาวิทยาลัยที่ดี ฯลฯ ที่ฉันสามารถอ่านได้ ขอบคุณมาก.


person Fermit    schedule 16.04.2020    source แหล่งที่มา
comment
คำถามของคุณถูกตั้งค่าสถานะเพื่อการตรวจสอบเนื่องจากคุณเป็นผู้โพสต์ใหม่ ข้อเสนอแนะ: เป็นคำถามที่ดี... คุณให้การสนับสนุนมากมายซึ่งแสดงให้เห็นว่าคุณได้ใช้ความพยายามอย่างมาก ฉันขอแนะนำให้เพิ่มแท็ก voip และ webrtc เนื่องจากฉันเห็นคำถามอื่นๆ มากมายที่ใช้แท็กนี้ ฉันหวังว่าคุณจะได้รับคำตอบที่ดี ฉันโหวตคำถามของคุณแล้ว   -  person buzz3791    schedule 16.04.2020
comment
ท่านฉันขอขอบคุณข้อเสนอแนะของคุณ อันที่จริงฉันได้เพิ่มข้อมูลให้มากที่สุดเท่าที่จะทำได้ในหัวข้อนี้ แต่จริงๆ แล้วฉันปฏิเสธความคิดที่จะเพิ่มข้อมูลมากเกินไปซึ่งอาจไปในทิศทางที่ผิดได้ ขอบคุณมากสำหรับคำแนะนำสำหรับแท็กและการโหวตของคุณ มีประโยชน์และซาบซึ้งจริงๆ!   -  person Fermit    schedule 16.04.2020
comment
นั่นคือรูปแบบซิงเกิลตัน   -  person Johannes Kuhn    schedule 18.04.2020
comment
ท่านที่ตอบคำถามของฉัน! ขอบคุณมากสำหรับคำตอบของคุณ!   -  person Fermit    schedule 18.04.2020