Java 在静态内部类中使用静态变量

Java 在静态内部类中使用静态变量,java,android,oop,Java,Android,Oop,我有一个类,它有一个静态的内部类。OuterClass希望使用静态内部类中的变量。问题是如果我使用实例变量,我需要实例化内部类。所以,我决定使用静态变量。它是否与OOP概念相反?如果是这样的话,我是否应该遵循其他原则或使用任何设计模式来做同样的事情 我使用静态类的原因是我想为android活动创建一个自定义生成器。问题是我不能使用构造函数初始化扩展活动的OuterClass。因此,我需要在onCreate()方法中加载这些静态变量 这是我的示例代码 public class DialogFact

我有一个类,它有一个静态的内部类。OuterClass希望使用静态内部类中的变量。问题是如果我使用实例变量,我需要实例化内部类。所以,我决定使用静态变量。它是否与OOP概念相反?如果是这样的话,我是否应该遵循其他原则或使用任何设计模式来做同样的事情

我使用静态类的原因是我想为android活动创建一个自定义生成器。问题是我不能使用构造函数初始化扩展活动的OuterClass。因此,我需要在onCreate()方法中加载这些静态变量

这是我的示例代码

public class DialogFactory extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setBackgroundDrawable(
        new ColorDrawable(android.graphics.Color.TRANSPARENT));

    setContentView(R.layout.activity_custom_dialog);
    this.setDialogTitle(Builder.title);
    this.setDialogMessage(Builder.message);
    this.loadButtons();
}

public void onClick(View view) {
    switch (view.getId()) {
    case R.id.dialog_positive_button:
        Builder.callable.onClickButton(Builder.type, DialogEventListener.ButtonType.POSITIVE_BUTTON);
        this.finish();
        break;
    case R.id.dialog_neutral_button:
        Builder.callable.onClickButton(Builder.type, DialogEventListener.ButtonType.NEUTRAL_BUTTON);
        this.finish();
        break;
    case R.id.dialog_negative_button:
        Builder.callable.onClickButton(Builder.type, DialogEventListener.ButtonType.NEGATIVE_BUTTON);
        this.finish();
        break;
    }
}

private void setDialogTitle(String title) {
    TextView view = (TextView) findViewById(R.id.dialog_title);
    view.setText(title);
}

private void setDialogMessage(String message) {
    TextView view = (TextView) findViewById(R.id.dialog_message);
    view.setText(message);
}

private void loadButtons() {
    Button positiveButton = (Button) findViewById(R.id.dialog_positive_button);
    Button negativeButton = (Button) findViewById(R.id.dialog_negative_button);
    Button neutralButton = (Button) findViewById(R.id.dialog_neutral_button);
    positiveButton.setVisibility(View.GONE);
    negativeButton.setVisibility(View.GONE);
    neutralButton.setVisibility(View.GONE);

    for (Map.Entry<DialogEventListener.ButtonType, String> entry: Builder.buttons.entrySet()) {
        if (entry.getKey() == DialogEventListener.ButtonType.POSITIVE_BUTTON) {
            positiveButton.setVisibility(View.VISIBLE);
            positiveButton.setText(entry.getValue());
        }
        else if (entry.getKey() == DialogEventListener.ButtonType.NEGATIVE_BUTTON) {
            negativeButton.setVisibility(View.VISIBLE);
            negativeButton.setText(entry.getValue());
        }
        else if (entry.getKey() == DialogEventListener.ButtonType.NEUTRAL_BUTTON) {
            neutralButton.setVisibility(View.VISIBLE);
            negativeButton.setText(entry.getValue());
        }
    }
}

@Override
  public void onBackPressed() {
  //
  }

public static final class Builder {
    private static DialogEventListener callable;
    private static DialogEventListener.DialogType type;
    private static String title;
    private static String message;
    private Context context;
    private static Map<DialogEventListener.ButtonType, String> buttons;

    public Builder(Context context, DialogEventListener callable,
        DialogEventListener.DialogType dialogType, String title, String message) {
        Builder.callable = callable;
        Builder.type = dialogType;
        Builder.title = title;
        Builder.message = message;
        this.context = context;
        Builder.buttons = new HashMap<DialogEventListener.ButtonType, String>();

    }

    public Intent build() {
        return new Intent(this.context, DialogFactory.class);
    }

    public void addButton(DialogEventListener.ButtonType buttonType, String label) {
        Builder.buttons.put(buttonType, label);
    }
  }
}
公共类DialogFactory扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
getWindow().setBackgroundDrawable(
新的彩色绘图(android.graphics.Color.TRANSPARENT));
setContentView(R.layout.activity\u custom\u对话框);
此.setDialogTitle(Builder.title);
此.setDialogMessage(Builder.message);
这是loadButtons();
}
公共void onClick(视图){
开关(view.getId()){
案例R.id.对话框\正面\按钮:
Builder.callable.onClickButton(Builder.type,DialogEventListener.ButtonType.POSITIVE\u按钮);
这个;
打破
案例R.id.对话框\空档\按钮:
Builder.callable.onClickButton(Builder.type,DialogEventListener.ButtonType.NEUTRAL\u按钮);
这个;
打破
案例R.id.对话框\负按钮:
Builder.callable.onClickButton(Builder.type,DialogEventListener.ButtonType.NEGATIVE\u按钮);
这个;
打破
}
}
私有void setDialogTitle(字符串标题){
TextView视图=(TextView)findViewById(R.id.dialog\u title);
view.setText(标题);
}
私有void setDialogMessage(字符串消息){
TextView视图=(TextView)findViewById(R.id.dialog\u消息);
view.setText(消息);
}
私有void加载按钮(){
按钮正按钮=(按钮)findViewById(R.id.dialog\u正按钮);
按钮否定按钮=(按钮)findViewById(R.id.dialog\u否定按钮);
Button neutralButton=(Button)findViewById(R.id.dialog\u neutral\u Button);
正按钮。设置可见性(View.GONE);
negativeButton.setVisibility(视图.消失);
neutralButton.setVisibility(View.GONE);
对于(Map.Entry:Builder.buttons.entrySet()){
if(entry.getKey()==DialogEventListener.ButtonType.POSITIVE_按钮){
positiveButton.setVisibility(View.VISIBLE);
positiveButton.setText(entry.getValue());
}
else if(entry.getKey()==DialogEventListener.ButtonType.NEGATIVE\u按钮){
negativeButton.setVisibility(View.VISIBLE);
negativeButton.setText(entry.getValue());
}
else if(entry.getKey()==DialogEventListener.ButtonType.NEUTRAL_按钮){
neutralButton.setVisibility(View.VISIBLE);
negativeButton.setText(entry.getValue());
}
}
}
@凌驾
public void onBackPressed(){
//
}
公共静态最终类生成器{
私有静态DialogEventListener可调用;
私有静态DialogEventListener.DialogType类型;
私有静态字符串标题;
私有静态字符串消息;
私人语境;
私有静态地图按钮;
公共生成器(上下文上下文,DialogEventListener可调用,
DialogEventListener.DialogType对话框类型,字符串标题,字符串消息){
Builder.callable=可调用;
Builder.type=对话框类型;
Builder.title=标题;
Builder.message=消息;
this.context=上下文;
Builder.buttons=newhashmap();
}
公共意图构建(){
返回新的意图(this.context,DialogFactory.class);
}
public void addButton(DialogEventListener.ButtonType ButtonType,字符串标签){
生成器.按钮.放置(按钮类型,标签);
}
}
}

查看您的代码后,我发现了多个问题。首先,Builder类中的构造函数使用较少。使用类名访问builder类的所有属性(将它们声明为static)将提供未初始化的引用,并将导致空指针异常


我不完全理解这里的
Builder
类的用途,但是如果可能的话,尝试创建一个单独的类来处理创建和初始化。之后,在activity类中创建一个Builder类实例,使用构造函数注入依赖项,并尝试使用Builder类中的函数来执行进一步的操作。

如果您展示的是真实的代码示例,而不是这种人为的伪代码,则会更容易理解。您几乎肯定是做错了,但是真正了解这些东西的唯一方法就是做错事(几十次)。好吧@MightyPork我已经上传了我真正的代码。我现在很迷茫。为什么要通过构造函数初始化静态生成器字段?我甚至不确定您需要Builder类做什么,实际上,我正在创建自己的自定义对话框。但是,通过构造函数初始化静态字段并不是一件好事。也许我应该使用静态方法初始化变量。代码实际上正在运行,唯一的问题是我不确定它是否遵循OOP概念。我甚至不这么认为。这就是为什么我问是否有更好的解决方案来做同样的事情。无论如何谢谢。谢谢你的评论,但问题是我不能使用构造函数来启动新的活动。我需要使用Intent Intent=newintent(上下文,DialogFactory.class);星触觉(意向);调用startActivity时,将调用目标活动的onCreate函数。您可以在onCreate函数中实例化Builder对象。是的,但如果我在insi中实例化Builder对象,则无法传递任何变量(例如标题、消息、DialogEventListener)