如果仅包含最终静态字段,嵌套类是否应标记为静态?

时间:2014-06-06 10:39:07

标签: java

我正在使用一个类来存储一些我可以在整个应用程序中访问的字符串。它看起来像:

public final class Settings {
    public final static class Setting1 {
        public final static String CONFIG = "A config string";
        private Setting1 (){};
    }
    public final class Setting2 {
        public final static String CONFIG = "A config string";
        private Setting2 (){};
    }
}

我发现我可以使用静态嵌套类(例如Setting1)或内部类(例如Setting2)。它们都可以以相同的方式使用:

System.out.println(Settings.Setting1.CONFIG); // Print: A config string
System.out.println(Settings.Setting2.CONFIG); // Print: A config string

因此,如果嵌套类只包含最终的静态字段,那么使用这两个字段有什么不同吗?由于私有构造函数,不允许实例化。这是否意味着这两个类现在是一样的?

4 个答案:

答案 0 :(得分:3)

如果嵌套/内部类不访问外部类的内容,没有外部类的非静态字段或方法,则应将其标记为静态。

实际上它是另一种方式:非静态内部类具有外部的开销:除了普通Settings.this之外的this

所以是的,在你的情况下肯定。该内部类的原因/作用当然是样式/命名空间。

答案 1 :(得分:0)

如果您只想存储静态最终字段,那么枚举将是比内部类更好的选择。事实上,您storing constants using static final fields枚举仅用于此目的。

答案 2 :(得分:0)

存储这些常量没有区别。但它通常不是一个好的代码风格。

答案 3 :(得分:0)

普通常量应始​​终为staticfinal(和不可变,这与final不同)。 如果你将按照内部类的方式进行,也应该是静态的。您可能也应该包含一个私有构造函数 - 以防止创建这些类(内部或外部)的实例。

那说,会出现什么问题?

public final class Settings {
    private Settings() { ; }
    public static final String SETTING_1 = "A config string";
    public static final String SETTING_2 = "Another config string";
}

回复Florescent Ticket的回答:

枚举用于存储静态最终字段(尽管其成员静态最终字段)。它们用于定义类型化的有界集(在集合的成员上有或没有其他属性)。一个典型的例子是public enum Suit { HEART, CLUB, SPADE, DIAMOND };

可以以这种方式表示你的设置(在枚举的每个成员上都有一个String属性)但是你没有真正的理由。如果您经常需要处理一组设置(我的意思是设置集 - 而不是那些设置的的集合),它可能会有所帮助。另一方面,如果您想要的设置不仅仅是字符串,那么它可能没那么有用。

最简单的起点可能只是定义一个具有public static final常量的类(当然它们也应该是不可变的)适当的值 - 无论是字符串还是其他什么。但是如果你想要内部类(也许是对设置进行分组),那么内部类应该是staticfinal(理想情况下,还有一个私有构造函数,以防止实例)。