如何重用来自不同 class 的方法

How to reuse a method from a different class

我有一个 authenticateID 方法,它在数据库中搜索以找到匹配项并执行某些操作。我想解释起来会花很长时间,所以这是我的代码:

public boolean authenticateStudentID() {

    boolean success = true;

    final String studentID = etStudentID.getText().toString().trim();
    final String module = etModule.getText().toString().trim();
    final String degree = etDegree.getText().toString().trim();
    final String room = etRoom.getText().toString().trim();
    final String email = etEmail.getText().toString().trim();
    final String fullname = etfullname.getText().toString().trim();
    final String loginID = etLoginID.getText().toString().trim();

    if (success) {
        databaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) { // wtf is this advanecd for loop
                    //map string string because our key is a string and value is a string, map has a key and value object
                    Map<String, String> map = (Map) snapshot.getValue();
                    if (map != null) { //if the values and keys are not null
                        String studentIDMatch = map.get("studentID");

                      //  Log.v("E_VALUE", "students ID entered : " + studentIDMatch);
                      //  Log.v("E_VALUE", "students ID from db: " + studentID);
                        if (studentID.equals(studentIDMatch)) {
                            String uniqueKey = databaseRef.push().getKey();

                            NewStudentAccounts sam = new NewStudentAccounts
                                    (studentID, loginID, email, fullname, module, degree, room);

                            databaseRef.child(uniqueKey).setValue(sam);

                            Toast.makeText(getApplicationContext(), "Your account registration has been successful!", Toast.LENGTH_SHORT).show();
                            startActivity(new Intent(getApplicationContext(), LoginActivity.class));
                        } else {
                            Toast.makeText(getApplicationContext(), "Invalid Student Credentials Entered!!", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
    }
    return success;

我想知道如何将此方法重用于另一个 class 而不是复制和粘贴代码。请指导我,我真的很感激。

private void addNewStudent() {

    findViewById(R.id.buttonAddStudent).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            View addStudentActivityDialog = LayoutInflater.from(LecturerAccount.this).inflate(R.layout.activity_add_student,null);

            etStudentName = addStudentActivityDialog.findViewById(R.id.editTextStudentName);
            etStudentUserID = addStudentActivityDialog.findViewById(R.id.editTextStudentUserID);

            AlertDialog.Builder addStudentBuilder = new AlertDialog.Builder(LecturerAccount.this);

            addStudentBuilder.setMessage("STAR").setView(addStudentActivityDialog).setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    String studentName = etStudentName.getText().toString();
                    String studentID = etStudentUserID.getText().toString();

                    registerActivity = new RegisterActivity(); //calling the instance of the class here

                    if (registerActivity.authenticateStudentID() == true){
                        studentarray.add(studentName);
                    }

                }
            }).setNegativeButton("cancel", null).setCancelable(false);
            AlertDialog newStudentDialog = addStudentBuilder.create();
            newStudentDialog.show();
        }
    });

}

我这里的if语句调用函数,我这里一窍不通

访问修饰符不正确。好老 java 医生会比我解释得更好: access modifiers

为了访问它,您必须像这样创建一个实例:

YourClass yourClass = new YourClass();
yourCLass.authenticateStudentID();

YourClass 通常是您粘贴此代码所在的文件的名称。

根据您所展示的内容,您需要处理两个问题:

  1. 如前所述,拥有它 private 在重用方面对您没有多大好处。

  2. 看起来 databaseRef 对象是 class 属性。所以你需要传递它,而不是依赖 class 属性 来获得 class,因为你想从另一个 class 使用它。 (或者您可以将此方法和 databaseRef 属性 放在超级 class 中,并让您的两个 class 继承它。)

一般来说 - 考虑您的方法需要做什么,然后需要做什么。这些应该影响您如何使该方法从代码的其他部分更有用。

因为您要重用的方法首先应该是 "public"。它只是意味着它可以 public 与该项目的其他 class 一起访问。在创建 public 之后,您可以简单地使用 class 名称引用它。

这是一个例子:

Class2 instance = new Class2();
instance.publicMehtodToBeAcessedInThisClass(any parameters);

但在您的情况下,您只需将代码复制并粘贴到另一个 class 文件。 原因:因为您正在从 Java 文件的布局文件中获取数据,这会使应用程序崩溃。要么你应该进一步模块化你的代码并通过创建一个单独的函数来获取所有这些数据来处理这个问题。否则,仅将方法从一个 class 复制粘贴到另一个不会使您的应用程序 运行 出现任何性能问题或滞后。

由于 onDataChange(DataSnapshot dataSnapshot) 是来自 firebase 的异步回调事件,您必须实施自己的回调方法才能收到结果通知。

一种方法是使用接口。

创建一个单独的 class Auth

public class Auth {

public static void authenticateStudentID(final String studentID, final AuthListener listener) {

    DatabaseReference databaseRef = FirebaseDatabase.getInstance().getReference("your reference");

    databaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) { // wtf is this advanecd for loop
                //map string string because our key is a string and value is a string, map has a key and value object
                Map<String, String> map = (Map) snapshot.getValue();
                if (map != null) { //if the values and keys are not null
                    String studentIDMatch = map.get("studentID");

                    if (studentID.equals(studentIDMatch)) {

                        if (listener != null)
                            listener.onAuthSuccess();


                    } else {

                        if (listener != null)
                            listener.onAuthFailure();
                    }
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            if (listener != null)
                listener.onAuthFailure();
        }
    });
}

public interface AuthListener {
    void onAuthSuccess();

    void onAuthFailure();
}

}

然后通过

调用
Auth.authenticateStudentID(studentId, new Auth.AuthListener() {
        @Override
        public void onAuthSuccess() {

        }

        @Override
        public void onAuthFailure() {

        }
    });

任何需要的地方