初始化类的字段成员的传统做法 来自C++背景,其中类的字段在构造函数内初始化。但是这里是java,我看到我可以在声明时初始化,这与C++ + 不同。
因此,我的问题是,初始化任何类的字段成员的最佳/传统做法是什么。是不是初始化类的字段成员的传统做法 来自C++背景,其中类的字段在构造函数内初始化。但是这里是java,我看到我可以在声明时初始化,这与C++ + 不同。,java,Java,因此,我的问题是,初始化任何类的字段成员的最佳/传统做法是什么。是不是 在宣布的时候 类testClass { 私人整数x=100; } 使用非静态作用域 类testClass{ 私人INTX; { x=100; } } 还是在构造函数内部 类testClass{ 私人INTX; testClass(){x=100;} } (由于我的背景,我有点倾向于初始化构造函数中的字段成员。)我不知道你的问题是否正确,但你想知道如何初始化类中的变量吗 private String s; pub
- 在宣布的时候 类testClass { 私人整数x=100; }
- 使用非静态作用域 类testClass{ 私人INTX; { x=100; } }
- 还是在构造函数内部 类testClass{ 私人INTX; testClass(){x=100;} }
(由于我的背景,我有点倾向于初始化构造函数中的字段成员。)我不知道你的问题是否正确,但你想知道如何初始化类中的变量吗
private String s;
public EditListener(String s){
this.s = s;
}
我认为初始化成员变量没有“最佳实践”。显然,在Java中,您可以在声明中初始化它们,这很好,也可以从构造函数中进行初始化。除非您需要执行一些复杂的操作(例如,获取对数据源的引用或类似的操作,这些操作可能仅在传递给构造函数的参数中可用) 换句话说,没有一个“正确的方法”来做,一致性可能更重要
也就是说,请记住,如果您不这样做,Java将为您初始化未初始化的成员变量。e、 g.
int
变量将设置为0,布尔值
变量将设置为false,任何对象都将设置为null,等等。您应该编写看起来最简单、最清晰的代码。我更喜欢在一行中声明和初始化一个简单的值,并分解更复杂的行
你可能会觉得这个通知很有趣
private final List<String> words = Arrays.asList("one", "two", "three");
private final List words=Arrays.asList(“一”、“二”、“三”);
或者使用双括号表示法
private final Map<String, Integer> map = new LinkedHashMap<String, Integer>() {{
put("one", 1);
put("two", 2);
put("three", 3);
}};
private final Map=new LinkedHashMap(){{
付诸表决(“一”,1);
放(二),二;;
付诸表决(“三”,3);
}};
虽然没有“最佳实践”,但在某些情况下某些方法效果最好
例如,如果您有一个简单的初始化值,那么您可以在声明的同时进行初始化
如果您有复杂的初始化逻辑(例如数组初始化),它可以进入构造函数内部
如果希望在构造函数之间共享公共初始化代码,则初始化程序块(非静态作用域)非常有用
您可以查看以下链接以了解更多详细信息不是如何做,而是何时做以及为什么要做。他想知道做
this.s=“abc”
或private String s=“abc”
是不是更好。哦,我在构造函数中被告知要这样做。所以这个.s=“abc”。@Max我想你的意思是私有字符串s;public MyClass(){this.s=“abc”}
或私有字符串s=“abc”代码>;)@Peter Lawrey:确实是这样,但是我的懒惰超出了我的意愿,无法对其进行透彻的解释:正因为如此,您通常没有任何字段可以选择在何处初始化。常量被声明为静态字段;对于一些复杂的对象(例如DB connection),您总是需要传递一些参数(因此它只能传递给构造函数,而不能传递给其他任何地方),并且一些基本变量的生命周期通常非常短,因此它们在每个方法中分别声明。我认为构造函数方式比我更可取。我试图避开依赖于语言的方法。@iamcreasy:正如我已经说过的,如果代码设计良好,通常只有使用某些参数初始化的字段,因此它们不可能在声明中。你能给我一些可以放在字段声明附近的字段初始值设定项的实例吗?Max,有时候(例如)我需要为类使用映射或ArrayList,它们不需要任何特殊参数,可以在声明处进行初始化。但通常,正如您所说,您需要参数来初始化变量(甚至依赖注入,这可能是更好的做法)。原因是您通常迟早会有多个构造函数。另外,如果它们没有初始化(特别是像类Thing{List parts=new ArrayList()…}
),读取器可能会假定部分为空,而实际上它总是引用一个最坏情况下为空的数组。