gpt4 book ai didi

java - 几个类之间的通信

转载 作者:搜寻专家 更新时间:2023-10-31 19:55:03 26 4
gpt4 key购买 nike

每当我制作一个程序时,我都倾向于将不同的部分划分到不同的文件中,我认为这样看起来更整洁。为了使问题更具体,假设我有这个由四个类组成的虚拟代码,

public class dummy {
public static void main(String[] args){
Alpha a = new Alpha();
Beta b = new Beta();
Gamma g = new Gamma();

int x,y,z,j,k,l,o,p,q;

x = a.getGammaX();
y = b.getGammaX();
z = g.getX();

a.setGammaX(1);

j = a.getGammaX();
k = b.getGammaX();
l = g.getX();

b.setGammaX(2);

o = a.getGammaX();
p = b.getGammaX();
q = g.getX();
}
}

class Alpha{
Gamma g = new Gamma();
public int getGammaX(){
return g.getX();
}

public void setGammaX(int x){
g.setX(x);
}
}

class Beta{
Gamma g = new Gamma();
public int getGammaX(){
return g.getX();
}

public void setGammaX(int x){
g.setX(x);
}
}

class Gamma{
int x = 10;

public int getX(){
return x;
}
public void setX(int y){
x = y;
}
}

Alpha 和 Beta 类与 Gamma 通信。整数的目的是打印出它们的值,并在从不同类调用 setter 后将它们相互比较。当我拆分这些部分时,我遇到的一个普遍问题是,当一个类更改 Gamma 中的值时,其他类具有过时的值,当 setter 方法具有被调用,除非我在花很多时间找到它之前发现它。

我倾向于通过传递 Gamma 类的一个引用来规避这一点,

Gamma g = new Gamma();
Alpha a = new Alpha(g);
Beta b = new Beta(g);

像这样,花几行代码更新一切。从“main”类创建引用的位置,其中“main”不一定是具有 main 方法的类,而是 Action 最多的类。

我的问题是,是否有一种标准方法可以处理此类问题,即多个类与另一个类通信、更改值等并以过时的值结束?

我的问题往往比显示的更微妙,但本质上这是我倾向于花一些时间尝试解决的问题。很抱歉,如果解释不清,我很难把问题说清楚,如果太难理解,请写在评论中,我会尽量把它弄清楚一点。

最佳答案

使用 MVC(模型- View -控制)模式或其变体之一,并让需要保存相同数据的类共享一个模型。例如,也许 Gamma 是您的模型,然后让其他类共享相同的 Gamma 实例

例如,

public class Dummy {
public static void main(String[] args) {
Gamma g = new Gamma();

Alpha a = new Alpha(g);
Beta b = new Beta(g);

// .........


}
}

class Alpha {
private Gamma g;

public Alpha(Gamma g) {
this.g = g;
}

public int getGammaX() {
return g.getX();
}

public void setGammaX(int x) {
g.setX(x);
}
}

class Beta {
// Gamma g = new Gamma();
private Gamma g;

public Beta(Gamma g) {
this.g = g;
}

public int getGammaX() {
return g.getX();
}

public void setGammaX(int x) {
g.setX(x);
}
}

class Gamma {
int x = 10;

public int getX() {
return x;
}

public void setX(int y) {
x = y;
}
}

要让类通知另一个类的状态更改,然后使用 JohnB 推荐的观察者模式。


请注意,获得观察者支持的一种方法是使用 JavaBean 的 PropertyChangeSupport。例如:

class Gamma {
public static final String X = "x";
private PropertyChangeSupport support = new PropertyChangeSupport(this);

private int x = 10;

public int getX() {
return x;
}

public void setX(int x) {
int oldValue = x;
int newValue = this.x;
this.x = x;
support.firePropertyChange(X, oldValue, newValue);
}

public void addPropertyChangeListener(PropertyChangeListener listener) {
support.addPropertyChangeListener(listener);
}

public void removePropertyChangeListener(PropertyChangeListener listener) {
support.removePropertyChangeListener(listener);
}
}

注意:使用共享 Gamma 类注入(inject) A 和 B 类的最好和最干净的方法可能是通过依赖注入(inject),例如从 Spring 的模块之一或从 Guice 框架中获得。

关于java - 几个类之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24579543/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com