我班上有很多参数,其中很多参数都是相互关联的。
首先,我有类似的东西:
public class MyClass {
private int[] filterA = {4,40};
private int filterAPasses = 3;
private String dataFilePath = "...";
private int dataChannels = 4;
private int dataFreq = 300;
private int[] timeRange = {30,40};
}
嗯,我不是很满意,在声明本身中不易阅读,也不是很方便使用,因为我有很多filterA[0]
,我必须记住索引0
的含义,和索引1
。
所以不是那样,我做了:
public class MyClass {
private interface filterA {
int left = 4;
int right = 40;
int passes = 4;
}
private interface dataFile {
String path = "...";
int channels = 4;
int frequency = 300;
}
private interface timeRange {
int from = 30;
int to = 40;
}
}
哪种方式更好,并允许我做一些很好的事情,例如filterA.left
,甚至将javadoc添加到left
但不知怎的,使用interface
来做这件事感觉很糟糕。那是好的方式吗?这些事情有更好的做法吗?
好吧,我完全错了,因为我不知道使用interface
这些参数将是最终的。
这绝对不是一个好方法。那么什么是好方法呢?
答案 0 :(得分:2)
您的第二种方法不起作用:接口中的所有字段都是final
,您将无法更改任何值(如果您想使用第一个字段,请使用类而不是接口例子)。
第二个示例中的名称不是很好的做法:接口名称应以大写字母(非静态)字段名称开头,并带有非大写字母。
答案 1 :(得分:1)
您应该按如下方式创建常量
public class FilterA {
public static final int LEFT = 4;
public static final int RIGHT = 40;
public static final int PASSES = 4;
}
对于其他类型的不同类,每个类可能在单独的文件中,并且您可以按如下方式访问上述值,
FilterA.LEFT
由于“LEFT”是整个资本,因此它是恒定的并且您只想使用它是完全可以理解的。如果你想修改它们,你可以删除final。
答案 2 :(得分:1)
您不希望使用接口来定义常量,这是常见的反模式,您可以从Effective Java(第2版)第19项中读取。接口应仅用于定义类型,而不是常量。
Rahul给出的答案更正确。您可能希望在FilterA
中放置一个私有构造函数,以避免实例化该类。
如果需要,可以在界面中定义访问器方法(例如getFilter)。这就是为什么做界面(定义行为,而不是实现)。
答案 3 :(得分:1)
如果您觉得更清楚,可以使用嵌套类。
public class MyClass {
static class FilterA {
int left = 4;
int right = 40;
int passes = 4;
}
private final FilterA filterA = new FilterA();
static class DataFile {
String path = "...";
int channels = 4;
int frequency = 300;
}
private final DataFile dataFile = new DataFile();
private interface TimeRange {
int from = 30;
int to = 40;
}
private final TimeRange timeRange = new TimeRange();
}
或只使用评论和有意义的名字。 (我的偏好)
public class MyClass {
// fliter settings
private int filterALeft = 4;
private int filterARight = 40;
private int filterAPasses = 3;
// data path attributes
private String dataFilePath = "...";
private int dataChannels = 4;
private int dataFreq = 300;
// time range
private int timeRangeFrom = 30;
private int timeRangeTo = 40;
}
答案 4 :(得分:0)
这有点主观,但是imho,你最好更进一步,实际上为你的数据块创建类,并让你的类字段引用这些类的实例,而不是你现在拥有的原语。 / p>