从 class 调用许多 class 的函数而不重置值

Call function from class for many classes without resetting values

所以基本上我在 Android 工作室中有几个不同的 Java classes。其中一个 classes 包含许多函数,我需要根据用户的选择从不同的 classes 调用这些函数。我的问题是我需要从中调用这些函数的 class 来记住它的变量值。这是 class 的一个精确示例,其中包含我需要调用的所有函数,一个重要的变量是 Logged。

一个解决方案是从每个需要访问它的 class 调用 class,但这需要 Classy classy= new Classy();然后会将变量重置为空。

public class Classy {
private String snumber;
private String spassword;
public Context context;
private boolean logged = false;

public String getSnumber() {
    return snumber;
}

public String getSpassword() {
    return spassword;
}

public void setContext(Context context) {
    this.context = context;
}

public void setSnumber(String snumber) {
    this.snumber = snumber;
}

public void setSpassword(String spassword) {
    this.spassword = spassword;
}

public boolean getLogged() {
    return logged;
}

public void setLogged(boolean logged) {
    this.logged = logged;
}

public boolean Read() {

    try {
        InputStream inputStream = context.openFileInput("COHFTW.txt");
        if (inputStream != null) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String receiveString = "";
            StringBuilder stringBuilder = new StringBuilder();

            while ((receiveString = bufferedReader.readLine()) != null) {
                stringBuilder.append(receiveString);
            }
            inputStream.close();
            String contents = stringBuilder.toString();
            if (contents.isEmpty()) {
                return false;
            } else {
                snumber = contents.substring(0, contents.indexOf("#"));
                spassword = contents.substring(contents.indexOf("#") + 1);
            }
        }
    } catch (FileNotFoundException e) {
        System.out.println("_______________File Not Found_________________");
        return false;

    } catch (IOException e) {
        System.out.println("________________File Unreadable________________");
        return false;

    }

    return true;
}


public boolean ClearFile() {


    try {
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.openFileOutput("COHFTW.txt", Context.MODE_PRIVATE));

        outputStreamWriter.write("");
        outputStreamWriter.close();
        System.out.println("________________________File Cleared________________");
        return true;

    } catch (Exception e) {
        System.out.println("________________Error:" + e + "________________");

        return false;

    }

}


public boolean Write() {

    System.out.println("________________Writing" + snumber + " " + spassword + "________________");

    try {
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.openFileOutput("COHFTW.txt", Context.MODE_PRIVATE));

        outputStreamWriter.write(snumber + "#" + spassword);
        outputStreamWriter.close();
        System.out.println("________________________Saved: " + snumber + "#" + spassword + "________________");
        return true;

    } catch (Exception e) {
        System.out.println("________________Error:" + e + "________________");

        return false;

    }

}

}

任何帮助将不胜感激,因为目前我每次想访问网页时都从文本文件中读取(名称和密码是从文本文件中获取的)并且它导致了一些严重的滞后.

问题中你的措辞有点奇怪,但如果我理解正确的话,我认为你想使用 class variables 而不是 instance变量。您所要做的就是将 static 关键字添加到您在 class 中定义的变量和方法中,并通过 class 访问变量而不是 实例


像这样:

private static String snumber;
private static String spassword;
private static boolean logged = false;
public static String getSnumber() {
    return Classy.snumber;
}

public static String getSpassword() {
    return Classy.spassword;
}

public static void setContext(Context context) {
    Classy.context = context;
}

public static void setSnumber(String snumber) {
    Classy.snumber = snumber;
}

public static void setSpassword(String spassword) {
    Classy.spassword = spassword;
}

public static boolean getLogged() {
    return Classy.logged;
}

public static void setLogged(boolean logged) {
    Classy.logged = logged;
}
/* The rest of your code */

这样,变量不依赖于您创建的 class 的实例,而是它们仅由 class本身.

但现在您不能执行 Classy classy = new Classy();,因为那样会生成一个新的 实例 ,并且它将没有 实例变量

编码愉快!

I have several different Java classes in Android studio. One of these classes contains a host of functions that I need to call from different classes based on what the user selects. My issue is that I need the class that I'm calling these functions from, to remember its variable values. [...]

A solution would have been to call the class from every class that needs access to it, but that would require Classy classy= new Classy(); which would then reset the variables to null.

Class Classy的方法都是实例方法,不是class方法,所以只有调用方法是在一个实例上。每个实例将在其生命周期内保留其变量的值,受通过其方法所做的更改的影响(或直接,在 public 变量 context 的情况下)。

然后,解决方案是在每个需要不同 Classy 值但不超过一。特别是,根据您的描述,听起来其他 classes 的方法确实不应该像您所说的那样创建自己的实例。

然后问题可能会归结为如何跨方法保留 Classy 个实例,但这很简单:您使用一个实例变量,或者可能是一个 class 变量,其他 class。如果每个人都需要保留自己的一组 Classy 变量,也许彼此 class 使用 Classy。或者如果每个其他 class 都应该使用相同的 Classy 实例,那么您也可以将其设为 Classy class 本身的 class 变量——这就是“单例”模式的核心。

这听起来像是一个完美的单例用例 class!

首先为您的 class.

创建一个 private static 实例
public class Classy {
    private static Classy instance;

接下来创建一个私有构造函数public方法 调用构造函数

private Classy(){ /*... */ }

public void instantiate(){
    if(instance != null) return;
    instance = new Classy();
} 

最后创建一个方法来获取你的单例

public static Classy getInstance() {
    // Optionally include a null check
    // if(instance == null) instantiate();
    return instance;
}

最终结果允许您在任何 class 中访问您的值,如下所示:

Classy.getInstance().getSpassword()