Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初始化类的字段成员的传统做法 来自C++背景,其中类的字段在构造函数内初始化。但是这里是java,我看到我可以在声明时初始化,这与C++ + 不同。_Java - Fatal编程技术网

初始化类的字段成员的传统做法 来自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()…}
),读取器可能会假定部分为空,而实际上它总是引用一个最坏情况下为空的数组。