Java:使用final-value和空构造函数设计问题

时间:2010-04-12 02:57:54

标签: java design-patterns constructor initialization

$ javac InitInt.java 
InitInt.java:7: variable right might not have been initialized
 InitInt(){}
           ^
1 error
$ cat InitInt.java 
import java.util.*;
import java.io.*;

public class InitInt {
 private final int right;

    // Design Problem?
    // I feel the initialization problem is just due to bad style.

 InitInt(){}
    InitInt{
           // Still the error, "may not be initialized"
           // How to initialise it?

            if(snippetBuilder.length()>(charwisePos+25)){
                    right=charwisePos+25;
            }else{
                    right=snippetBuilder.length()-1;
            }
    }

 public static void main(String[] args) {
  InitInt test = new InitInt(); 
  System.out.println(test.getRight());
 }
 public int getRight(){return right;}
}

部分解决方案和建议

  1. 使用“this”来访问类中的方法,而不是创建空构造函数
  2. 将决赛更改为非最终
  3. with final field value:初始化每个构造函数中的所有最终值
  4. 删除空构造函数,保持代码简洁明了

6 个答案:

答案 0 :(得分:3)

你的意思是定义,而不是初始化。您所遇到的问题(在相当激进的编辑之后)是您正在定义一个不初始化最终变量的构造函数,Java不允许 - 所有终结需要在实例完成时初始化构建。在构造函数中初始化它,或者使它成为非最终的

答案 1 :(得分:2)

您无法将newint一起使用。 int是基元,new是对象运算符。请考虑使用Integer,或者只为其分配一个整数文字。

答案 2 :(得分:2)

是的,问题是你的一个构造函数没有初始化最终字段。在Java中,最终的非静态字段必须在声明时,初始化块或 EVERY 构造函数中初始化!示例中的默认构造函数不会这样做。 还要记住,只有在想要使用继承功能时,实现一个空的默认构造函数才有意义。如果您没有提供默认构造函数,但是您将为其他一些Java创建一个隐藏的默认构造函数,因为默认构造函数不是必需的。所以实现像MyClass(){}之类的东西,没有特殊目的 - 保持代码清洁并保存!

答案 3 :(得分:1)

你的if-else语句没有错,在构造函数中的分支语句中初始化最终变量没有错。我刚刚运行了一个像你这样的简单构造函数来初始化private int right,它运行正常。确保正确地声明构造函数,如InitInt() { ... }

您发布的错误是因为您的代码InitInt(){}中有一个没有初始化right的空构造函数。您需要初始化此构造函数和所有构造函数中的最终字段。

答案 4 :(得分:0)

你的构造函数绝对是Okey !!!!问题是你没有初始化“正确”变量。

您必须初始化“正确”变量:

private final int right = 0;

答案 5 :(得分:0)

如果您只尝试访问类中的方法,请使用this,而不是为它创建空构造函数:

import java.io.*;
import java.util.*;

public class FileDir {
        private ArrayList<Integer> lineNumbers;
        FileDir(Integer nth){
                lineNumbers=new ArrayList<Integer>();
                lineNumbers.add(nth);
                // You don't need an empty constructor
                // to call class methods, use "this"
                this.printHello("Davids");
        }
        public static void main(String[] args) {
                FileDir test = new FileDir(7);
                ArrayList<Integer> inteTest=test.getLineNumbers();
                for (Integer i : inteTest)
                        System.out.println(i);
        }
        public void printHello(String name) { System.out.println("Hello "+ name); }
        public ArrayList<Integer> getLineNumbers() { return lineNumbers; }
}