Java: проблема проектирования с конечным значением и пустым конструктором - PullRequest
0 голосов
/ 12 апреля 2010
$ 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. с окончательным значением поля: инициализировать все конечные значения в каждом конструкторе
  4. удалите пустой конструктор, сделайте ваш код простым и чистым

Ответы [ 6 ]

3 голосов
/ 12 апреля 2010

Вы имеете в виду определить, а не инициализировать. Проблема, с которой вы столкнулись (после этого довольно радикального редактирования), заключается в том, что вы определяете конструктор, который не инициализирует конечную переменную, чего Java не позволяет - все финалы должны быть инициализированы к моменту завершения экземпляра строительство. Или инициализируйте его в своем конструкторе, или сделайте его не окончательным

2 голосов
/ 12 апреля 2010

Да, проблема в том, что один из ваших конструкторов не инициализирует последнее поле. В Java конечные нестатические поля должны быть инициализированы во время объявления, в блоке инициализации ИЛИ в конструкторе EVERY ! Конструктор по умолчанию в вашем примере этого не делает. Помните также, что реализация пустого конструктора по умолчанию имеет смысл, только если вы хотите использовать функции наследования. Если вы не предоставите конструктор по умолчанию, но у вас будет другой, Java не создаст для вас скрытый конструктор по умолчанию, потому что по умолчанию он не требуется. Так что не реализуйте такие вещи, как MyClass () {} без какой-либо специальной цели - держите ваш код в чистоте и сохраняйте!

2 голосов
/ 12 апреля 2010

Вы не можете использовать new с int. int является примитивом, а new является оператором объекта. Попробуйте вместо этого использовать Integer или просто присвоить ему целочисленный литерал.

1 голос
/ 12 апреля 2010

В вашем операторе if-else нет ничего плохого и нет ничего плохого в инициализации конечной переменной внутри оператора ветвления в конструкторе. Я просто запустил простой конструктор, как ваш, чтобы инициализировать private int right, и он работал нормально. Убедитесь, что вы правильно объявляете свой конструктор как InitInt() { ... }.

Ошибка, которую вы опубликовали, заключается в том, что в вашем коде InitInt(){} есть пустой конструктор, который не инициализирует right. Вам нужно инициализировать конечные поля в этом и во всех конструкторах.

0 голосов
/ 12 апреля 2010

Если вы пытаетесь получить доступ только к методам в классе, используйте 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; }
}
0 голосов
/ 12 апреля 2010

Ваш конструктор абсолютно Окей !!!! Проблема в том, что вы оставили "правую" переменную неинициализированной.

Вы должны инициализировать «правильную» переменную:

private final int right = 0;
...