【问题标题】:Java: how to name boolean propertiesJava:如何命名布尔属性
【发布时间】:2010-05-31 17:27:00
【问题描述】:

我刚刚在一个 Web 应用程序中遇到了一个小惊喜,我在 .jsp 页面中使用了 EL。

我添加了一个布尔属性并摸不着头脑,因为我将布尔值命名为“isDynamic”,所以我可以这样写:

<c:if test="${page.isDynamic}">
   ...
</c:if>

我觉得比以下更容易阅读:

<c:if test="${page.dynamic}">
   ...
</c:if>

但是.jsp 编译失败,报错:

javax.el.PropertyNotFoundException: Property 'isDynamic' not found on type com...

我发现我的 IDE(我花了一些时间才注意到它)在生成 getter 时生成了一个名为:

isDynamic()

代替:

getIsDynamic()

一旦我将 isDynamic() 手动替换为 getIsDynamic(),一切正常。

所以我在这里有两个问题:

  1. 布尔属性名称以“is”开头是否不好?

  2. 不管它是不是坏的,IntelliJ 不是在这里通过自动生成一个名为 isDynamic 而不是 getIsDynamic 的方法犯了错误吗?

【问题讨论】:

    标签: java jsp el


    【解决方案1】:
    1. 敏感主题,但我认为很糟糕。变量名不应该表示一个问题,而是一个陈述。例如。 pageIsDynamicdynamicaldynamicallyGenerated。但是,对此没有明确的编码约定。只要您在整个编码过程中保持一致,任何一种方式都不会造成太大伤害。

    2. 不,它没有。 Javabean specification 声明允许在布尔 getter 方法名称前加上 is 前缀。它通常在get 以上是首选。与其他所有体面的 IDE 一样,IntellIJ 只是遵循此规范。 Eclipse 和 Netbeans 也会这样做。这是第 8.3.2 章的摘录:

    8.3.2 布尔属性

    此外,对于布尔属性,我们允许使用 getter 方法来匹配模式:

    public boolean is<PropertyName>();
    

    可以提供这个“is&lt;PropertyName&gt;” 方法来代替“get&lt;PropertyName&gt;” 方法, 或者它可以在“get&lt;PropertyName&gt;” 方法之外提供。

    在任何一种情况下,如果布尔属性存在“is&lt;PropertyName&gt;” 方法,那么我们将使用“is&lt;PropertyName&gt;” 方法来读取属性值。 一个示例布尔属性可能是:

    public boolean isMarsupial();
    public void setMarsupial(boolean m);
    

    【讨论】:

    【解决方案2】:

    isDynamic() 通常是作为 boolean getter 的方式。

    public boolean isDynamic() {
      return dynamic;
    }
    

    您可以在模板中使用:

    <c:if test="${dynamic}">
     ...
    </c:if>
    

    【讨论】:

      【解决方案3】:

      更典型的做法是将属性命名为不带“is”,让访问者带“is”。不过,您当然可以更改 IDE 生成的内容,如果这对您来说更清楚,可以让“getIsDynamic()”成为访问器。

      【讨论】:

      • 这很有趣...因此,当从 EL 访问此类属性时(例如),您将失去“isXXX”的“好处”(看到在 EL 中您直接键入属性的名称,而不是 getter 方法名称)。我的意思是,当您阅读 "isXXX" 时,您知道答案是是/否(真/假)。如果您在没有“is”的情况下命名该属性,则您将完全丢失该信息。
      • 那行不通。我刚刚尝试过:如果您在没有 "is" 的情况下命名 bean 属性并将您的 getter 方法命名为 "isDynamic" 则 EL 找不到该 bean。
      • 实际上它起作用了,BalusC 提醒我更换我的 EL,现在它起作用了。谢谢大家:)
      【解决方案4】:

      因为在 Java 中变量名和方法之间没有冲突,所以如果 isDynamictrue 时返回 isDynamic() 方法是可以的。或者,如果“动态性”实际上是对象的真实属性,而不仅仅是您需要的布尔值,那么至少这很好。

      例如,verbose 是一个布尔值,通常不是对象的属性,因此使用 isVerbose() 方法是个坏主意(除非它是 Console 类)。

      拥有一个名为isDynamic 的布尔值是一个很好的表达方式。它建议您该变量是bool,无需任何额外努力。

      【讨论】:

        猜你喜欢
        • 2016-08-31
        • 2010-11-18
        • 1970-01-01
        • 1970-01-01
        • 2015-01-07
        • 2010-12-06
        • 1970-01-01
        • 2018-09-21
        相关资源
        最近更新 更多