java - 如何处理有时不使用某个特定变量的类

标签 java

初学者问题在这里。我正在编写一个 Java 程序,该程序在 Internet 上查询公共(public) API 以检索论坛上讨论的详细信息。数据以 JSON 形式返回,我将其解析为 Java 对象以在我的程序中使用。

讨论通常包含五个属性,即五个公共(public)变量。但针对有限数量的特定搜索类型,不返回评论数量。

是否有处理这种情况的“最佳”(就面向对象编程而言)方法?下面是我的第一次尝试,其中我简单地编写了两个构造函数,一个为 numberOfComments 赋值,一个不赋值。

这似乎不是一个很好的解决方案 - 如果另一个类创建 DiscussionDetails 对象,使用不填充 numberOfComments 的构造函数,但随后尝试使用 numberOfComments 字段,会发生什么情况?

我想也许它应该被分成两个类,其中 DiscussionDetails 没有 numberOfComments 字段,而 DiscussionDetailsS​​pecialised 是一个带有额外 numberOfComments 字段的子类。为了一个领域,这对我来说有点矫枉过正。

或者可能有一种约定,这样的变量初始化为特定值,如“false”或“-1”或其他值?

对于这种情况,有经验的程序员会使用其他更好的方法吗?

我知道这个例子很简单,但我用它来尽可能简单地说明我的问题。

/**
 * Wrapper for a set of JSON data returned from an API
 */
public class DiscussionDetails 
    {
    public String discussionID;
    public String discussionName;
    public String discussionURL;
    public String submittedDate;
    public String numberOfComments;

    /**
     * Constructor that populates all fields
     */
    public DiscussionDetails(String discussionID, String discussionName, String discussionURL, String submittedDate, String numberOfComments)
        {
        this.discussionID = discussionID;
        this.discussionName = discussionName;
        this.discussionURL = discussionURL;
        this.submittedDate = submittedDate;
        this.numberOfComments = numberOfComments;
        }

    /**
     * Constructor method to use when the number of comments is unknown, which happens in certain specific cases
     */
    public DiscussionDetails(String discussionID, String discussionName, String discussionURL, String submittedDate)
        {
        this.discussionID = discussionID;
        this.discussionName = discussionName;
        this.discussionURL = discussionURL;
        this.submittedDate = submittedDate;
        } 
    }

最佳答案

这在传统上是用“特殊”值(显然没有意义的值,例如:-1 表示计数)或 null(在某种意义上是最特别的值)。

处理这个问题的“最佳”方法是,恕我直言,java.util.Optional:客户端在希望使用值时必须检查值是否存在,Optional 明确了这一点,避免了客户端忘记检查的常见错误来源。

关于java - 如何处理有时不使用某个特定变量的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48938048/

相关文章:

java - java.util.Calendar 的默认时区是什么?

java - 为什么同时声明读写资源会抛出异常?

java - JTable 中 JEditorPane 中的超链接

Java:2D HashMap的最后访问

java - Eclipse 和命令行的 Java 输出不同

java - 如何使用 Swipe View 实现 android TabLayout 设计支持库

java - ListView ViewHolder 项目 subview 可见性改变

java - Wicket Junit 测试用例

java - 用于 Facebook 身份验证的跨操作系统简单网络浏览器

java - 此递归中的 Stackoverflow 错误