【问题标题】:Does Java have dynamic variables for class members?Java 是否有用于类成员的动态变量?
【发布时间】:2011-02-05 11:49:13
【问题描述】:

我想知道是否可以在 Java 中制作动态变量。换句话说,根据我的指示而改变的变量。

编辑 重新表述我的问题,我的意思是类的变量会根据给定的变量(stockType,对于那些继续阅读的人)改变类型。

仅供参考,我正在制作一个交易程序。给定的商家将有一系列以各种价格出售的商品。

我所呼吁的活力是因为每个待售商品类别都有自己的属性。例如,一本书有两个属性:int pages 和 boolean hardCover。相反,书签项有一个属性,字符串模式。

这是代码的骨架 sn-ps,因此您可以看到我要做什么:

public class Merchants extends /* certain parent class */ {
        // only 10 items for sale to begin with
        Stock[] itemsForSale = new Stock[10]; 

        // Array holding Merchants
        public static Merchants[] merchantsArray = new Merchants[maxArrayLength];

        // method to fill array of stock goes here
}

public class Stock {
    int stockPrice;
    int stockQuantity;
    String stockType; // e.g. book and bookmark
    // Dynamic variables here, but they should only be invoked depending on stockType
    int pages;
    boolean hardCover;
    String pattern;
}

【问题讨论】:

  • 请重新表述问题。变量根据定义是“动态的”,并且可以通过指令进行更改(如果您想在 Java 中避免这种情况,则必须将它们标记为“最终”)。我认为您正在寻找 OO 用语中的“对象”。
  • 谢谢,你是对的。我已根据 Pyrolistical 的有用标题编辑重新措辞。
  • 这实际上技术上可以使用反射和某种类编辑库,但绝对不推荐......

标签: java dynamic variables


【解决方案1】:

我不确定您到底想要什么,但听起来State design-pattern 可能适合您查看。

【讨论】:

    【解决方案2】:

    您可以在此处使用factory design pattern。原因是,根据 stockType,您需要一个特定/动态的对象,工厂会为您提供。

    【讨论】:

      【解决方案3】:

      而且有充分的理由。

      无论如何做你想做的事情,而不是拥有一个 stockType,将 Stock 子类化为你想要的不同类型。

      请举例说明您希望如何处理动态变量,我们可以向您展示如何操作。

      也不要使用数组。它们是固定长度的,只有真正有 C++ 之类的。请改用List

      Stock[] itemsForSale = new Stock[10]; 替换为List<Stock> itemsForSale = new ArrayList<Stock>(); 并阅读有关List 的信息

      【讨论】:

      • 感谢您提供有关 List 的提示。我会尽快将我的数组换成列表。
      • "...而且只有真正的 C++ 之类的"。废话。数组之所以存在,是因为它们对于实现大量无法使用列表有效实现的类是必不可少的。例如,String、StringBuilder、流 API、... ArrayList 和 HashMap!
      • @斯蒂芬嘘!不会谈论实现细节!我生活在一个抽象的世界中,因此您的观点没有实际意义! =)
      • 顺便说一下,这个交易程序将以一种或另一种 IRL 的方式实施。根本不是抽象的东西。 :)
      • 这不仅仅是一个实现细节。这是 Java 语言设计的一个基本点。
      【解决方案4】:

      将您的Stock 子类化为每种股票类型:

      public class Stock {
          private int price;
          private int quantity;
      }
      
      public class StockBook extends Stock {
          private int pages;
          private boolean hardCover;
      }
      
      public class StockBookmark extends Stock {
          private String pattern;
      }
      

      或者对不同类型的属性使用Map

      public class Stock {
          private int price;
          private int quantity;
          private String classification; // e.g. book and bookmark
          private Map properties = new HashMap();
      }
      

      【讨论】:

      • 不要在 Stock 中使用 HashMap 作为类型的一部分。使用地图。 HashMap 是一个实现,除非你是认真的,否则不应被引用。
      • Stock 类型可能应该是一个枚举,以便在编译时捕获错误。 stockPrice 也有点多余,因为它是 stock 类的一部分。
      【解决方案5】:

      您可能需要考虑使用多态性。

      public class Stock {
          int stockPrice;
          int stockQuantity;
          int stockType;
      }
      
      public class Book extends Stock{
          int pages;
          boolean hardcover;
      }
      
      public class Bookmark extends Stock {
          String pattern;
      }
      

      【讨论】:

        【解决方案6】:

        Java 不允许动态变量。相反,您应该应用面向对象的设计技术。

        在这种情况下,您应该定义一个具有通用方法和成员的抽象类 Stock,并为以下类型扩展该类:BookBookmark 等。请参阅下面的示例。

        为 Stock 使用抽象类的优点(其他答案尚未显示)是“Stock”项目不能真正独立存在。在商家的书架上放置 5 只股票是没有意义的,就像在商家的书架上放置 5 本书一样有意义。

        public abstract class Stock {
            private int stockPrice;
            private int stockQuantity;
        
            // Implement getters and setters for stockPrice and stockQuantity.
        }
        
        public class Book extends Stock {
            // Since I'm extending Stock, I don't have to redefine price or quantity
            private int pages;
            private boolean hardCover;
        
            // Implement getters and setters for pages and hardCover.
        }
        
        public class Bookmark extends Stock {
            private String pattern;
        
            // Implement getters and setters for pattern.
        }
        

        请注意,为了确定您稍后要处理的对象类型,如果您必须这样做,您将使用以下检查:

        if (myStock instanceof Book) { ... }
        

        【讨论】:

        • 这是一个优雅的解决方案,但我想知道如何将所有书籍和书签项目收集到 Merchants 类中的 Stock[] itemsforSale 数组或列表中?
        • Arvanem:由于 Book 和 Bookmark 扩展了 Stock,他们会很高兴地进入 Stock[] 而没有任何抱怨。 :)
        猜你喜欢
        • 1970-01-01
        • 2019-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多