Java 如何重用来自不同类的方法

Java 如何重用来自不同类的方法,java,android,firebase,code-reuse,Java,Android,Firebase,Code Reuse,我有一个authenticateID方法,它在数据库中搜索以查找匹配项并执行某些操作。我想这需要很长时间来解释,所以下面是我的代码: public boolean authenticateStudentID() { boolean success = true; final String studentID = etStudentID.getText().toString().trim(); final String module = etModule.getText

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

我的if语句在这里调用函数,我在这里完全不懂。

访问修饰符不正确。好的旧java文档将比我更好地解释:

要访问它,您必须创建如下实例:

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

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

根据您的演示,有两个问题需要解决:

  • 如前所述,当涉及到重用时,让它
    private
    对您没有多大好处

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


  • 总的来说——想想你的方法需要做什么,然后想想它需要做什么。这些应该决定如何使方法从代码的其他部分变得更可用。

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

    以下是一个例子:

    Class2 instance = new Class2();
    instance.publicMehtodToBeAcessedInThisClass(any parameters);
    
    但是在您的情况下,您只需要将代码复制并粘贴到另一个类文件中。 原因:因为您正在从Java文件的布局文件获取数据,这将使应用程序崩溃。或者您应该进一步模块化您的代码,并通过创建一个单独的函数来获取所有这些数据来处理这个问题。否则,仅将一个方法从一个类复制粘贴到另一个类不会使您的应用程序遇到任何性能问题或延迟。

    因为
    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();
    }
    

    在需要的地方

    函数中的“private”子句是一个很大的提示;)是的,我正在考虑将其更改为public,但是如果我在另一个类中使用它,我如何才能以我想要的方式调用它。然后你真的必须在你的问题中添加一些代码,显示你想要如何调用它…有几种方法。好的,我将尝试准备一些代码并展示我的想法。我已经添加了我想要的。我不懂Java,但是您能像您的class.authenticateStudentID()一样进行静态调用吗;?我已经这样做了,谢谢,但是我想检查新创建的ID是否不在数据库中,以便不存在重复项静态是可能的,但是您必须确保方法中的所有调用都不引用非静态字段或方法。编译器将帮助您there@Samir你的问题与原来的问题无关。您没有提供您的尝试。我可以复制并粘贴authenticateStudentID主体。但这不是我想要的。非常感谢。你能告诉我更多关于我如何处理代码的信息吗?当然可以@Samir。模块化是一种使代码更有效、更可读的特性。在开发复杂的大规模应用程序时,尤其是在Android中,您应该始终尝试模块化您的代码。首先确定代码中要执行的重要功能,然后为每个重要操作编写一个函数。这也支持代码的可重用性。关于模块化的争论可以继续下去。所以我强烈建议你用谷歌搜索它,增加你的知识,因为这肯定会对你有很大帮助。谢谢你的例子,你把它的类型从布尔改为void。当我想调用返回true的方法时,这会中断我的代码。
    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() {
    
            }
        });