我试图了解无状态和有状态之间的区别。
我以Java LayoutManager为例。通常我不能为多个容器使用例如BorderLayout的实例。 我认为在有状态策略中,上下文会将自身作为对策略操作的论证。这样该策略可以到达该策略算法所需的所有数据。
我有一个有状态策略的代码段。我认为这里的背景是“面板的创建”,对此我们有不同的策略。
public class LayoutComparer extends JFrame {
private LayoutManager layout;
private String title;
public static void main(String[] args) {
JFrame f = new LayoutComparer();
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
static int counter = 0;
JPanel createPanel(LayoutManager layout, String title) {
this.layout = layout;
this.title = title;
JPanel p = new JPanel();
p.setLayout(layout);
p.add(new JButton("Click " + counter++), "West");
p.add(new JButton("Click " + counter++), "Center");
p.add(new JButton("Click " + counter++), "East");
p.setBorder(BorderFactory.createTitledBorder(title));
return p;
}
LayoutComparer() {
setTitle("Layout Manager Test");
setLayout(new GridLayout(1, 2));
LayoutManager m;
m = new java.awt.FlowLayout();
// m = new java.awt.BorderLayout();
add(createPanel(m, "Left"));
// pack();
add(createPanel(m, "Right"));
}
}
答案 0 :(得分:1)
简而言之,“有状态”是指执行某些操作的实例(在您的情况下为LayoutManager)拥有超出要执行的操作范围的某些状态。如果在操作过程中它保持状态,我仍然会认为它是无状态的,但不一定是线程安全的。
这表示“无状态”实例将不具有任何“持久”状态(超出当前操作的范围),并且理想情况下根本不具有任何状态,因此使其具有更高的线程安全性(可能还需要处理其他事情)考虑使其完全具有线程安全性。
对于LayoutManager,您需要记住,它不仅会在创建组件时使用,而且还会在组件的生存期内用于调整大小等。
不需要任何特殊设置或可以使用通用设置(例如FlowLayout)的LayoutManager可能被认为是无状态的(我不知道其内部使用了什么),但是像BorderLayout
这样的管理器需要特定的需要保留/保持的配置(例如北,南,中等组件),从而使LayoutManager处于有状态。