【问题标题】:How to reuse a method from a different class如何重用来自不同类的方法
【发布时间】:2018-01-01 01:54:12
【问题描述】:

我有一个 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;

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

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 语句在这里调用了函数,我在这里完全一无所知。

【问题讨论】:

  • 函数中的“private”子句是一个很大的提示;)
  • 是的,我正在考虑将其更改为 public,但如果我在另一个课程中使用它,我怎么能按我想要的方式调用它。
  • 那么你真的必须在你的问题中添加一些代码,显示你想如何调用它......有几种方法
  • 好的,我会尝试准备一些代码并展示我的想法。
  • 我已经添加了我想要的内容。

标签: java android firebase code-reuse


【解决方案1】:

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

一种方法是使用接口。

创建一个单独的类 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() {

        }
    });

需要的地方

【讨论】:

  • 感谢您提供的示例,您将其类型从 boolean 更改为 void。当我想调用该方法时,如果它返回 true,这会破坏我的代码。
【解决方案2】:

因为您要重用的方法首先应该是“公共的”。它只是意味着它可以在该项目的其他类中公开访问。在将其公开后,您可以简单地使用类名来引用它。

这是一个例子:

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

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

【讨论】:

  • 非常感谢。你能告诉我更多关于如何模块化我的代码吗?
  • 是的,当然@Samir。模块化是使您的代码更有效和可读性的属性。在制作复杂和大规模的应用程序时,尤其是在 Android 中,您应该始终尝试模块化您的代码。首先确定代码中要执行的重要功能,然后为每个重要操作编写一个函数。这也使您的代码具有可重用性。好吧,关于模块化的辩论可以继续进行。所以我强烈建议你用谷歌搜索它并增加你对此的了解,因为这肯定会对你有很大帮助。
【解决方案3】:

访问修饰符不正确。好的旧java文档会比我解释得更好: access modifiers

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

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

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

【讨论】:

  • 我不懂 Java,但你能像 YourClass.authenticateStudentID(); 那样进行静态调用吗?
  • 我已经这样做了,谢谢,但是我想检查一下新创建的ID是否不在数据库中,以便没有重复
  • static 是可能的,但是您必须确保方法中的所有调用都不会引用非静态字段或方法。编译器会帮助你
  • @Samir 您的问题与原始问题无关。你没有提供你的尝试。
  • 我可以复制并粘贴该 authenticateStudentID 正文。但这不是我想要的
【解决方案4】:

从您所展示的内容来看,您需要处理两个问题:

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

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

一般来说 - 想想你的方法需要做什么,然后需要做什么。这些应该塑造您如何使该方法在代码的其他部分中更有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多