在课堂上组织属性的好习惯?

时间:2012-03-15 11:24:11

标签: java attributes

我班上有很多参数,其中很多参数都是相互关联的。

首先,我有类似的东西:

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这些参数将是最终的。 这绝对不是一个好方法。那么什么是好方法呢?

5 个答案:

答案 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>