0

我在随机发送表单中有一个主表单(RandomSend)和另一个名为(_user)的表单,我声明了一个公共静态变量:

 public class RandomSend extends javax.swing.JFrame {
 ......
public static String userGender; // this variable I want to change from another form (_user)
....
}

并在 RandomSend 类中我声明了 _user 尝试更改userGender值的实例

 _user setGender = new _user();
  setGender.setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
  setGender.setAlwaysOnTop(true);
  setGender.setVisible(true);

在 _user 表单(类)中,我尝试更改userGender值:

public class _user extends javax.swing.JFrame {......
     ....
     RandomSend.userGender="male";
     ....}

当我检查_user中的值时, RandomSend.userGender 的值是“男性”

但从我的主要形式来看,该值为空......


新的 新的

我的尝试根据答案号 1 public class RandomSend extends javax.swing.JFrame {

/**
 *
 */

private static String userGender;
 .....
.....
// show dialogbox to select gender...
 _user setGender = new _user();
  setGender.setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
  setGender.setAlwaysOnTop(true);
  setGender.setVisible(true);

....
....

// setter
public static void setUserGender(String gender)
{
    if(gender.toLowerCase().equals("female") ||gender.toLowerCase().equals("male"))
    userGender = gender;
    else userGender= "Unknown!!";
}

//getter
public static String getUserGender()
{
        return userGender;
 }

在另一个类(框架)中:

public class _user extends javax.swing.JFrame {
....
....

RandomSend.setUserGender("male");
..
..
..
}

但 Randomsend.userGender 不会改变!

4

1 回答 1

2

您可以通过使用在该对象上定义的 getter 和 setter 函数来更改对象的成员值。要使用您的示例,您最终会得到以下内容:

public class RandomSend extend javax.swing.JFrame {
    // This should be preferred for values that can mutate (non-final) to prevent
    // modification without the owning class being alerted the value is changing
    private static String userGender;

    public static void setUserGender(String value) {
        userGender = value;
    }

    public static String getUserGender() {
        return userGender;
    }
}

使用此示例,您将通过调用更改值,并通过调用RandomSend.setUserGender("male")读取该值RandomSend.getUserGender()

一些附加说明

我只是想指出一些我注意到的关于您的样本的其他事情。以你现在的方式使用static价值观不一定是最好的主意。您以错误的方式锁定了课程的使用。您应该维护一个User类的实例或管理特定于用户的信息(例如性别)的某种其他类型的类。通过管理实例而不是类上的静态值,您可以在需要时更轻松地处理应用程序中的其他用户。如果您确定您永远不需要支持超过当前用户,那么您仍然可以使用实例,但使用单例模式实现它。

这看起来像:

public class SingletonExample {
    private static SingletonExample instance = null;

    // Declared private to prevent new SingletonExample 
    // outside of this class
    private SingletonExample {} 

    public static SingletonExample getInstance() {
        if (instance == null) {
            instance = new SingletonExample();
        }

        return instance;
    }
}

您可以通过获取类似的实例来使用此类SingletonExample.getInstance(),然后对该实例进行操作。使用此方法可确保在项目的所有点中,您都在访问同一对象的同一实例,从而在某种意义上实现“全局”。

我想做的另一个说明是尝试使用final值或更好的值,enum而不是像性别这样的字符串,您最有可能将其用作值。我这样说是因为为了正确比较性别,你必须这样做:

if (RandomSend.userGender.equals("male")) {
    // ...
}

如果您改为创建一个Gender具有以下常量的类:

public Gender {
    public static final int MALE = 1;
    public static final int FEMALE = 2;
}

和比较(提供适当类中的值变化)

if (RandomSend.userGender == Gender.MALE) {
    // ...
}

并且没有更多浪费的字符串文字被传递。这是一个好主意,Java 有一个独特的结构来提供这个称为enums 的解决方案。你会像这样定义一个Gender枚举:

public enum Gender {
    MALE,
    FEMALE;
}

然后您将您声明userGender为一个Gender值,并且您的比较与您从具有常量值的类自己构建枚举相同。从长远来看,这些更改可以使您的项目更易于管理和维护。

于 2013-10-24T16:05:51.983 回答