Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将参数传递给枚举抽象方法_Java_Oop_Enums_Factory - Fatal编程技术网

Java 将参数传递给枚举抽象方法

Java 将参数传递给枚举抽象方法,java,oop,enums,factory,Java,Oop,Enums,Factory,我需要给出一个搜索属性工厂(作为面向对象策略原则的一部分)。 我已经为这些选项编写了以下枚举: public enum CompareChoice { ABS { public Path compare(Path path1, Path path2) { return absCompare(path1, path2); } }, TYPE { public Path compare(Path

我需要给出一个搜索属性工厂(作为面向对象策略原则的一部分)。 我已经为这些选项编写了以下枚举:

    public enum CompareChoice {
    ABS {
        public Path compare(Path path1, Path path2) {
            return absCompare(path1, path2);
        }
    },

    TYPE {
        public Path compare(Path path1, Path path2) {
            String type1 = getFileType(path1);
            String type2 = getFileType(path2);
            int compareValue = type1.compareTo(type2);
            if (compareValue == 0) {
                return absCompare(path1, path2);
            }

            if (compareValue > 0) {
                return path1;
            }

            return path2;
        }

    },

    SIZE {
        public Path compare(Path path1, Path path2) throws IOException {
            Long size1 = Files.size(path1);
            Long size2 = Files.size(path2);
            int compareValue = size1.compareTo(size2);
            if (compareValue == 0) {
                return absCompare(path1, path2);
            }

            if (compareValue > 0) {
                return path1;
            }

            return path2;
        }
    };

    public abstract Path compare(Path path1, Path path2) throws IOException;
}
我面临的问题是,我需要支持(所有三种选择中的)反向排序。 我曾想过以某种方式将一个
boolean
参数传递给
compare
的这些实现,但我不知道如何传递。
任何关于如何通过仍然使用
enum
来实现这一点的想法都将非常有用

由于Java8,
Java.util.Comparator
有一个默认方法,您可以使用

您可以让您的
enum
实现
Comparator
,然后“免费”获得反向排序,但这意味着更改
compare
的签名以适应
Comparator
契约(您需要为方法想出另一个名称,在我的示例中,我将其命名为
select

仅取一个枚举值以保持其简短:

public enum CompareChoice implements Comparator<Path> {

  SIZE {
    @Override
    public int compare(Path path1, Path path2) {
      int r = Long.compare(
        Files.size(path1),
        Files.size(path2)
      );
      if (r == 0) {
        return absCompare(path1, path2);
      }
      else {
        return r;
      }
    }
  };

  // rest of the methods:
  public static Path select(Comparator<? super Path> rule, Path path1, Path path2) {
    return rule.compare(path1, path2) <= 0 ? path1 : path2;
  }
}
您可以查看comparator中的其他默认方法,以查看实现
comparator
时获得的其他内容,尽管其中大部分可能对您没有多大用处

您也可以考虑将其重构为一个整体,因此您的<代码> CopaReule<代码>可能不是一个“真正”的比较器,而是返回一个比较器。这样,您可以更好地将关注点与比较器实现分离:

public enum CompareChoice {
  ABS {
    public Comparator<? extends Path> comparator() {
      return Comparator.comparing(this::absCompare); // whatever absCompare means
    }
  },

  SIZE {
    public Comparator<? extends Path> comparator() {
      return Comparator.comparingLong(Files::size).thenComparing(ABS.comparator());
    }
  };


  public abstract Comparator<? extends Path> comparator();
}
公共枚举比较{
腹肌{

public Comparator您有什么版本的Java?比8更新?只有8(不允许在本练习中使用更新的版本)没关系,8就足够了。如何使用
compare
方法?您打算如何传递布尔值?compare方法用于我实现的自定义排序。我不知道如何传递布尔值,这是我的问题。注意:我的解决方案不仅需要更改
compare
方法的返回类型,还需要调用
reversed()
CompareChoice
上的
不会生成
CompareChoice
实例,因此此类调用无法链接。总之,我更喜欢使用
comparator()
方法。
public enum CompareChoice {
  ABS {
    public Comparator<? extends Path> comparator() {
      return Comparator.comparing(this::absCompare); // whatever absCompare means
    }
  },

  SIZE {
    public Comparator<? extends Path> comparator() {
      return Comparator.comparingLong(Files::size).thenComparing(ABS.comparator());
    }
  };


  public abstract Comparator<? extends Path> comparator();
}