Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Java 在构造函数中初始化私有变量_Java_Variables_Initialization - Fatal编程技术网

Java 在构造函数中初始化私有变量

Java 在构造函数中初始化私有变量,java,variables,initialization,Java,Variables,Initialization,我一直在看这段代码的比较。我的问题是,在构造函数中初始化两个私有变量(在默认构造函数中完成)有一个特殊的好处。我知道第二个构造函数可以用来创建具有提供的值的实例。如果我这样做会有什么不同 private String sortBy = COLUMN_LAST_NAME; private boolean ascending = true; 我很抱歉,如果这是一个非常简单和一般的问题 public class CustomComparator implements Comparator<S

我一直在看这段代码的比较。我的问题是,在构造函数中初始化两个私有变量(在默认构造函数中完成)有一个特殊的好处。我知道第二个构造函数可以用来创建具有提供的值的实例。如果我这样做会有什么不同

private String sortBy = COLUMN_LAST_NAME;
private boolean ascending = true; 
我很抱歉,如果这是一个非常简单和一般的问题

public class CustomComparator implements Comparator<StudentList>
{   private String sortBy;
private boolean ascending;

public CustomComparator()
{
    sortBy = COLUMN_LAST_NAME;
    ascending = true;
}

public CustomComparator(String sortBy, boolean ascending)
{
    this.sortBy = sortBy;
    this.ascending = ascending;
}
公共类CustomComparator实现Comparator
{私有字符串排序;
私有布尔递增;
公共CustomComparator()
{
sortBy=列\姓\名;
升序=真;
}
公共CustomComparator(字符串排序,布尔升序)
{
this.sortBy=sortBy;
这个上升=上升;
}

我想不出有什么区别,我更喜欢在变量声明中初始化。

我所看到的最好的实践是有一个构造函数接受所有参数,即使这意味着它必须是私有的,然后使用
从其他构造函数调用它(…,…)
同时提供适当的值

这将使您尽可能多地重用代码,并且将来的修复只在一个地方进行—无需对代码进行双重维护

您的示例如下所示:

public class CustomComparator implements Comparator<StudentList> {
    private String sortBy;
    private boolean ascending;

    public CustomComparator()
    {
        this(COLUMN_LAST_NAME, true);
    }

    public CustomComparator(String sortBy, boolean ascending)
    {
        this.sortBy = sortBy;
        this.ascending = ascending;
    }
}
public class CustomComparator implements Comparator<StudentList> {
    private final String sortBy;
    private final boolean ascending;

    public CustomComparator() {
        sortBy = COLUMN_LAST_NAME;
        ascending = true;
    }

    public CustomComparator(String sortBy, boolean ascending) {
        this.sortBy = sortBy;
        this.ascending = ascending;
    }
}
公共类CustomComparator实现Comparator{
私人字符串排序;
私有布尔递增;
公共CustomComparator()
{
这(列姓,真);
}
公共CustomComparator(字符串排序,布尔升序)
{
this.sortBy=sortBy;
这个上升=上升;
}
}

初始化通常被认为是在构造函数中,以便更容易区分静态成员的静态初始化和实例变量的每个实例初始化。没有性能差异。

实际上,如果您关心对象的不变性,这很重要(您应该:-))。如果两个字段都是
最终
,则必须按如下方式初始化它们:

public class CustomComparator implements Comparator<StudentList> {
    private String sortBy;
    private boolean ascending;

    public CustomComparator()
    {
        this(COLUMN_LAST_NAME, true);
    }

    public CustomComparator(String sortBy, boolean ascending)
    {
        this.sortBy = sortBy;
        this.ascending = ascending;
    }
}
public class CustomComparator implements Comparator<StudentList> {
    private final String sortBy;
    private final boolean ascending;

    public CustomComparator() {
        sortBy = COLUMN_LAST_NAME;
        ascending = true;
    }

    public CustomComparator(String sortBy, boolean ascending) {
        this.sortBy = sortBy;
        this.ascending = ascending;
    }
}
公共类CustomComparator实现Comparator{
私人最终字符串排序;
私有最终布尔递增;
公共CustomComparator(){
sortBy=列\姓\名;
升序=真;
}
公共CustomComparator(字符串排序,布尔升序){
this.sortBy=sortBy;
这个上升=上升;
}
}
或者更好:

public class CustomComparator implements Comparator<StudentList> {
    private final String sortBy;
    private final boolean ascending;

    public CustomComparator() {
        this(COLUMN_LAST_NAME, true);
    }

    public CustomComparator(String sortBy, boolean ascending) {
        this.sortBy = sortBy;
        this.ascending = ascending;
    }
}
公共类CustomComparator实现Comparator{
私人最终字符串排序;
私有最终布尔递增;
公共CustomComparator(){
这(列姓,真);
}
公共CustomComparator(字符串排序,布尔升序){
this.sortBy=sortBy;
这个上升=上升;
}
}

这都是你需要的,两个构造函数都是很好的选择,显然如果你想初始化字段是最好的选择,但是如果你像Hibernate上的实体或Spring框架上的bean一样使用这个类,如果你不编写空构造函数,什么都不会正常运行

如果您考虑DTO模式,声明@Tomasz Nurkiewicz之类的可变字段,那么参数化构造函数是唯一的选择


但正如我之前所说,这取决于需求…

嗨,carlosZ,我是个新手,所以即使是这些简单的声明也让我想知道我是否遗漏了什么:-)多亏了Tomasz,如果我使用private final boolean ascending=true;在构造函数之外,这会对对象不变性产生什么影响?@t0mcat到参数构造函数uctor完全不能使用。@t0mcat:因为一旦分配了
final
值,就不能在构造函数或任何其他地方更改(仅一次语义)最终字段只能分配一次。如果您在构造函数外部分配值,则无法分配任何新值。请考虑像照片这样的最终字段,如果您不想在初始化私有变量(例如,因为它们是独立变量)时使构造函数混乱,则无法分配任何新值@Franco,@Tomasz..谢谢:)外部代码的凹痕(假设sortBy已经被初始化为与所用构造函数无关的相同值),并且它们不能在短的一行代码中赋值,您可以使用初始化器块。