【问题标题】:Public Variables in a Stand-Alone Program独立程序中的公共变量
【发布时间】:2015-10-17 03:12:42
【问题描述】:

我正在编写一个小的 Java 程序,它随机分发扑克牌,然后将它们显示在屏幕上的窗口中。

自从我使用 NetBeans 以来,GUI 就为我启动了,我一直在编写随机选择卡片的方法,设置一个数组来存储卡片是否已经发牌等等,所有在 NetBeans 构建 JFrame 时为我设置的同一类中。

我想将所有非 GUI 代码移动到它自己的类中,然后根据需要将数据传回 GUI 类以显示卡片,但我不确定共享数据的最佳方式两个班级之间。

我知道 set/get 方法,我知道我可以创建公共类级变量,但我一直在阅读的所有内容都告诉我要尽可能避免这两种方法。

现在我有一个方法可以为每张发牌生成一个 1 到 52 之间的整数。 1 = 黑桃 A,2 = 黑桃 2,等等。一旦 GUI 有了那个数字,它就可以在屏幕上的适当位置显示适当的卡片(或者至少在我编写 GUI 编码后它能够事情的一面)。如果我希望将该整数值传递给 GUI 类,然后根据该值在屏幕上显示特定的卡片,我应该怎么做?

在我看来,公共变量和简单的 get 方法一样可以让这件事变得简单……但为了避免这些选项,还有其他方法吗?

如果有帮助,我可以提供代码 sn-ps。

【问题讨论】:

  • “但是我一直在阅读的所有内容都告诉我要尽可能避免两者” - 真的吗?大多数 OO 原则建议避免使用公共字段(变量)并更喜欢通过方法访问
  • 为什么要避免使用 get 方法?
  • GUI 应该让您生成该值的类,GUI 不应该关心该值是如何生成的,只是它是以一致且记录在案的方式生成的。据我所知,这需要一个方法(因为它是一个计算值)。另一种解决方案是使用观察者模式,其中 GUI 注册对生成代码的兴趣,当生成一个值时,它会通过(Swing 调用的)监听器通知它,但在我看来,这对于您的目的来说似乎有点过分了
  • 根据经验 - 公共变量是禁忌,但访问私有变量或执行操作的公共方法是标准的。
  • 我建议您做任何最简单的事情(这可能是公共变量),直到您对 Java(和编程)有足够的了解以了解为什么其他人不建议使用它们。 (最好自己找出为什么事情被认为是不好的)

标签: java swing user-interface netbeans


【解决方案1】:

这是您可以开始使用 OO 概念实现这一想法的一种方法。

制作一个Card类来表示一张卡片。

public class Card {
    // FIELDS
    // card name
    private final String name;
    // card value (number)
    private final int value;
    // another arbitrary value to demonstrate setter
    private Object arbitraryValue;


    public Card(String name, String value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return this.name;
    }

    public int getValue() {
        return this.value;
    }

    public Object getArbitraryValue() {
        return this.arbitraryValue;
    }

    public void setArbitraryValue(Object arbitraryValue) {
        this.arbitraryValue = arbitraryValue;
    }
}

创建一个 CardManager 类来保存与处理卡片相关的方法(例如实用程序方法和卡片数据存储)

public class CardManager() {
    private List<Card> cards = new ArrayList<Card>();

    public void addCard(Card card) {
        this.cards.add(card);
    }

    // and so on...your methods here.
}

最后,为您的 GUI (CardGUI) 管理创建一个类,并利用其他类来管理它。

你可以这样做:

public class CardGUI() {
    public static void main(String[] args) {
        // create your GUI and put your logic here...
        // also use your other classes, perhaps like so.
        Card card = new Card("One", 1);
        CardManager cardManager = new CardManager();
        cardManager.addCard(card);

        // From there you can manage your cards through other classes.
}

希望这有助于/演示如何按照标准在类之间共享数据。

编辑: 要准确回答您如何获得价值的问题,请参阅上面的 Card 类。您可以简单地创建一张新卡 (Card card = new Card("name", intval);),然后使用方法 Card#getValue() 获取该值并将其显示在 GUI 中。

【讨论】:

  • 感谢您的回答和意见,这一切都非常有帮助。如果我正确理解了这些概念,get/set 可能会很糟糕,因为它们仍然会限制您修改对象和类的能力,如果您有很多它们,它们会使代码管理成为一场噩梦。公共变量容易被那些使用你的代码的人修改和篡改,这可能是它自己的问题。我敢肯定还有更复杂和微妙的问题在起作用,但到目前为止我就是这么理解的。
  • @scudder 确实如此。但是,对于您的程序类型,包括 getter/setter 是常见的做法,甚至是推荐的。
  • @scudder 如果您担心它们使您的代码看起来如何,那么您可以尝试 projectlombok。这是一个项目,它允许您用 [at]Getter[at]Setter[at]Data 等变量声明上的注释替换创建 getter/setter。我将它用于我的项目,以避免常量 getX()、setY() 等声明。无论如何,getter/setter 通常是访问类外数据的方法,它们是最安全的。
猜你喜欢
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2012-10-10
  • 2012-01-09
  • 2014-02-17
  • 1970-01-01
相关资源
最近更新 更多