我正在编写一个程序,它有两个我希望使用的最终变量,我需要在实际运行类时设置它们,因为它们可能在每个实例中都不同。
我的初始化与我希望在初始化名称和类型但不是值时使用的任何其他类变量相同。
public final String filename, filepath;
在构造函数中,我将值设置如下
public myClass(String value) {
this.filename = value;
this.filepath = anotherPartOfValue;
}
当我这样做时,我收到一条警告:“最终字段[x]可能已被分配”
有没有办法避免这个警告,仍然保持最终状态并在构造函数中设置值?
我正在使用eclipse btw。
编辑:
这是给我错误的确切代码
import java.io.*;
public class Dirt {
private String[] tables;
private int numTables;
private final String filename, filepath;
public Dirt(String file) {
this.tables = new String[0];
this.numTables = 0;
for (int i = file.length(); i < 0; i--) {
if (file.charAt(i) == '/') {
this.filename = file.substring(i);
this.filepath = file.substring(1, i-1);
}
}
}
}
答案 0 :(得分:7)
问题是您要在循环中分配最终变量。没有什么可以阻止循环多次循环并且if
条件不止一次被满足。 (如果file
中有两个'/'字符会怎么样?或者没有?)
解决此问题的一种方法是在构造函数中使用临时String变量,然后在结尾处将它们分配给filename
和filepath
:
public Dirt(String file) {
this.tables = new String[0];
this.numTables = 0;
String name = null;
String path = null;
for (int i = file.length(); i < 0; i--) {
if (file.charAt(i) == '/') {
name = file.substring(i);
path = file.substring(1, i-1);
// need a break here?
}
}
this.filename = name;
this.filepath = path;
}
这很丑陋,但这是一种直截了当的方式,可以确定filename
和filepath
肯定会被分配,并且肯定只会被分配一次。
答案 1 :(得分:2)
完全可编译和可运行:
public static void main(String[] args) {
Foo f = new Foo("abc");
System.out.println(f.filename);
System.out.println(f.filepath);
}
static class Foo {
public final String filename, filepath;
public Foo(String value) {
this.filename = value;
this.filepath = value.substring(1);
}
}
你提到的“警告”不只是一个警告。这是一个错误。但它不是来自这里。
编辑:新发布的代码在循环中具有分配。根据定义,循环中的语句可以执行多次,因此您可以多次分配最终变量。