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();
}