java - 如何以静态和非静态方式使用枚举

标签 java android oop static enums

我有 2 个 Activity ,ActivityAActivityB,每个 Activity 有 3 个按钮。我在一台连接的设备上显示 ActivityA ,在另一台连接的设备上显示 ActivityB 。每个按钮都可以处于两种状态之一,但这些状态需要反射(reflect)在两个设备上。我使用带有静态方法的 util 类来接收来自两个 Activity 的按钮按下并将其发送到服务,并在从服务回调时更新两个 Activity 中按钮的状态。

现在,每个按钮都从 xml 调用其相应 Activity 中的函数。例如 Button1onClick 如下所示:

android:onClick="button1Clicked"

该函数(来自其相应的 Activity )调用 UtilClass 中的函数,如下所示:

public void button1Clicked(View view) {
    UtilClass.button1Cliked();
}

我在 UtilClass 中设置了一个 enum,这样我就知道要更新哪个按钮(在 ActivityAActivityB 中) ) 在从服务回调时。它看起来像这样:

public class UtilClass {

public static Button buttonPressed = WfdOperationButton.NONE;

public enum Button {
    BUTTON1, BUTTON2, BUTTON3
}

public static void button1Cliked() {
        buttonPressed = Button.BUTTON1;
        //call asynctask to tell the service button1 was pushed by passing
        //buttonPressed
}

public static void button2Cliked() {
        buttonPressed = Button.BUTTON2;
        //call asynctask to tell the service button2 was pushed by passing
        //buttonPressed
}
...

我的问题是如何在 ActivityAActivityB 中使用 UtilClass 中的相同 enum 来合并UtilClass 中的 3 个 buttonXClicked() 函数?我在 UtilClass 中尝试的更改如下:

public static void buttonCliked(Button inButton) {
        buttonPressed = inButton;
        //call asynctask to tell the service inButton was pushed by passing
        //buttonPressed
}

但这不起作用,因为我无法在静态函数中的 ActivityAActivityB 中使用非静态 enum 来传入。但我需要枚举是非静态的,因为我需要在 UtilClass 中使用它。

我是 Android 新手,因此如果我做错了什么,如果您指出,我将不胜感激。

谢谢!

最佳答案

静态方法的这些问题可能是 O-O 设计问题的证据。快速阅读一下,听起来好像你试图在一个类上做太多事情,而且变得很困惑。一些想法:

为什么要在这里将 Button 枚举定义为嵌套类?您可以将其外部化(即移至其自己的文件),然后共享问题就会消失,假设我在这里理解您的意思。

一般来说,如果您正在编写像 UtilClass 这样的帮助器类(尽管我怀疑这里实际上有必要),请考虑将所有内容都设为非静态。

要正确存储状态,请考虑推荐的 Android 方法之一。对于像这样的简单事情,Shared Preferences可能就足够了。如果你真的不想这样做,一个有状态的 singleton适当引用枚举的对象应该执行此操作。那么您的调用将类似于:

public void button1Clicked(View view) {
    ButtonState.getInstance().setState(Button.Button1);
    // call wrapper for async call to say Button1 was pressed e.g.:
    serviceClient.sendButtonState(Button.Button1);
}

class ButtonState {
    private static ButtonState instance = new ButtonState();
    private Button state

    public ButtonState getInstance() {
        return instance;
    }

    public void setState(Button value) {
        state = value;
    }

    public Button getState() {
        return state;
    }
}

或类似的。

关于java - 如何以静态和非静态方式使用枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13020418/

相关文章:

oop - 具体实现是否应该提供其实现的接口(interface)中不存在的任何公共(public) API?

php - PDO - 查询不返回结果

java - 将类似方法重构为策略模式的性能成本?

java - 重定向应用程序(java)的输入但仍然允许 BASH 中的标准输入

java - 如何以惰性方式连接java中的两个集合?

java - 一种开发多版本java spring Rest api的方法\设计

java - Android中的Sqlite : DataBaseObjectNotClosedException

android - 如何将 ICE 候选人添加到 sdp 描述中

用于渐进式 Web 应用程序的 Android 状态栏图标

android - LLVM 在 Android NDK 工具链中有什么用?