【问题标题】:How to remove "Assignment of parameter" is not allowed checkstyle error?如何删除“参数分配”不允许检查样式错误?
【发布时间】:2021-05-08 17:25:29
【问题描述】:

我目前正在使用 Java 编写一个简化的学校课程系统,并且正在使用 CheckStyle 检查样式。当我在我的一个类上运行 CheckStyle 时,它​​给了我两个错误:

Assignment of parameter 'endTime' is not allowed.
Assignment of parameter 'startTime' is not allowed.

我尝试了多种方法来解决这个问题,因为我不能只在使用该注释时创建一个 setter。

顺便说一句,我也在使用 Eclipse。

    public void setMeetingDaysAndTime(String meetingDays, int startTime, int endTime) {
    if (meetingDays == null || meetingDays.length() == 0) {
        throw new IllegalArgumentException("Invalid meeting days.");
    }
    if ("A".equals(meetingDays)) {
        this.meetingDays = meetingDays;
        startTime = 0;
        endTime = 0;

这只是我的错误发生位置的一个 sn-p。

【问题讨论】:

    标签: java eclipse checkstyle


    【解决方案1】:
    startTime = 0;
    

    这是重新分配参数startTime

    您没有粘贴很多 - 如果startTime 也是一个字段,这不是分配该字段。就像上面的那行一样,您需要this.startTime = 0 才能使用该字段(当您通过接受与该字段同名的参数来隐藏该字段时,需要this. 东西)。

    或者,关闭这个 lint checkstyle 错误,这很愚蠢。它试图避免在方法运行期间混淆该值是什么,但修复需要创建一个新的局部变量,该变量本身至少同样令人困惑。换句话说,它是一种风格检查,它提出了一个治疗方法比它所指向的疾病更糟糕的点。

    如果您的意图真的是继续使用setMeetingDaysAndTime 方法,就好像startTime0,那么创建一个新的局部变量:

    public void setMeetingDaysAndTime(String meetingDays, int startTime_, ...) {
        int startTime = startTime_;
    
        if ( ... ) {
            startTime = 0;
        }
    }
    

    【讨论】:

      【解决方案2】:

      以下description is given for ParameterAssignment

      不允许分配参数。

      理由:参数分配通常被认为是糟糕的编程 实践。迫使开发人员将参数声明为 final 通常是 繁重的。检查确保永远不会分配参数 将两全其美。

      在你的情况下,

      startTime = 0;
      endTime = 0;
      

      可能是错误而不是

      this.startTime = 0;
      this.endTime = 0;
      

      取决于是否有您真正想要的字段startTimeendTime

      为防止出现此错误(当存在与字段同名的参数时),请确保使用this.<fieldName> = ...; 或使用前缀new 用于setter 方法参数:

      public void setMeetingDaysAndTime(String newMeetingDays, int newStartTime, int newEndTime) {
          if (newMeetingDays == null || newMeetingDays.length() == 0) {
              throw new IllegalArgumentException("Invalid meeting days.");
          }
          if ("A".equals(newMeetingDays)) {
              meetingDays = newMeetingDays;
              startTime = 0;
              endTime = 0;
      

      如果您确实想为参数分配新值,请改用具有描述性名称的变量。

      示例:而不是重新分配参数,例如:

      public void foo(String message, int value) {
          message = message.trim();
          value = value < 0 ? 0 : value;
          bar(message, value);
      

      改用局部变量:

      public void foo(String message, int value) {
          String trimmedMessage = message.trim();
          int normalizedValue = value < 0 ? 0 : value;
          bar(trimmedMessage, normalizedValue);
      

      Eclipse 还提供 ParameterAssignment Checkstyle 警告作为 编译器警告项目 > 属性:Java 编译器 > 错误/警告):代码风格 > 参数任务。而对于根本原因,如果错误地丢失了this.,则会出现编译器警告名称阴影和冲突>局部变量声明隐藏另一个字段或变量,这也是默认禁用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        • 2018-07-12
        相关资源
        最近更新 更多