在哪里放置常量属性?
Where to place constant attributes?
我想在 java 中编写干净的代码,但我对将我的属性放在哪里非常不安全。
我经常无法决定,是将它们放在 class 的顶部,在构造函数中还是直接在方法中。那里有一些规则吗?对我来说唯一的逻辑是,当这些属性在不止一种方法中使用时,将属性放在 class 之上。
你能从干净代码的角度评价这段代码吗?我应该将常量货币属性放在构造函数中吗?我还可以将一些 class 属性放在方法中吗?谢谢指教
public class CsvFileReader {
private SimpleDateFormatStringToDate formatter = new SimpleDateFormatStringToDate();
private IataExchangeRateDataSet exchangeRateDataSet= new IataExchangeRateDataSet();
private final String SEMICOLON_DELIMITER = ";";
// Currency attributes index
private final int CURRENCY_VALUE = 1;
private final int CURRENCY_ISO_CODE = 2;
private final int CURRENCY_PERIOD_START = 3;
private final int CURRENCY_PERIOD_END = 4;
public CsvFileReader(IataExchangeRateDataSet exchangeRateDataSet) {
this.exchangeRateDataSet = exchangeRateDataSet;
}
public void readCsvFile(String fileName, final int maxLengthOfColumn) {
BufferedReader fileReader = null;
try {
String line = "";
fileReader = new BufferedReader(new FileReader(fileName));
while ((line = fileReader.readLine()) != null) {
String[] tokens = line.split(SEMICOLON_DELIMITER);
//TODO: Noch auf Vollständigkeit der Zeile, Korrektheit der Datumsformate und ähnliches überprüfen
if ( tokens.length== maxLengthOfColumn && DateFormat.checkDateFormat(tokens[CURRENCY_PERIOD_START]) && DateFormat.checkDateFormat(tokens[CURRENCY_PERIOD_END])) {
//format currency value in csv
tokens[CURRENCY_VALUE]=tokens[CURRENCY_VALUE].replace(",", ".");
IataExchangeRateData iataExchangeRateData = new IataExchangeRateData(
new BigDecimal(tokens[CURRENCY_VALUE]), tokens[CURRENCY_ISO_CODE],
formatter.parseStringToDate(tokens[CURRENCY_PERIOD_START]),
formatter.parseStringToDate(tokens[CURRENCY_PERIOD_END]));
exchangeRateDataSet.getExchangeRateDataSet().add(iataExchangeRateData);
}
}
}
catch (Exception e) {
System.out.println("Error in CsvFileReader");
e.printStackTrace();
} finally {
try {
fileReader.close();
} catch (IOException e) {
System.out.println("Error while closing fileReader !!!");
e.printStackTrace();
}
}
}
}
干净的代码问题通常会引发争论,有些正确,有些则不太正确。但是我已经感觉到你现在对常量的处理方式,并且我已经按照你在代码中所做的方式使用它们,即在构造函数之上。但最近,我将它们放在 interface
中。有点像这样
public interface CurrencyConstants {
int CURRENCY_VALUE = 1;
int CURRENCY_ISO_CODE = 2;
int CURRENCY_PERIOD_START = 3;
int CURRENCY_PERIOD_END = 4;
}
然后我简单地导入接口并像这样使用常量..
CurrencyConstants.CURRENCY_VALUE
如果在多个 class 中使用常量,这会有所帮助。干杯!
- 如果任何属性用于方法内部的计算或操作,则仅在方法内部使用该属性。
- 如果正在使用任何属性使得任何方法都可以引用它,则在所有方法的顶部使用它。
- 如果任何属性不依赖于 class,例如计算特定对象的线程数,则通过将其设为静态将其用作 class 变量。
我想在 java 中编写干净的代码,但我对将我的属性放在哪里非常不安全。
我经常无法决定,是将它们放在 class 的顶部,在构造函数中还是直接在方法中。那里有一些规则吗?对我来说唯一的逻辑是,当这些属性在不止一种方法中使用时,将属性放在 class 之上。
你能从干净代码的角度评价这段代码吗?我应该将常量货币属性放在构造函数中吗?我还可以将一些 class 属性放在方法中吗?谢谢指教
public class CsvFileReader {
private SimpleDateFormatStringToDate formatter = new SimpleDateFormatStringToDate();
private IataExchangeRateDataSet exchangeRateDataSet= new IataExchangeRateDataSet();
private final String SEMICOLON_DELIMITER = ";";
// Currency attributes index
private final int CURRENCY_VALUE = 1;
private final int CURRENCY_ISO_CODE = 2;
private final int CURRENCY_PERIOD_START = 3;
private final int CURRENCY_PERIOD_END = 4;
public CsvFileReader(IataExchangeRateDataSet exchangeRateDataSet) {
this.exchangeRateDataSet = exchangeRateDataSet;
}
public void readCsvFile(String fileName, final int maxLengthOfColumn) {
BufferedReader fileReader = null;
try {
String line = "";
fileReader = new BufferedReader(new FileReader(fileName));
while ((line = fileReader.readLine()) != null) {
String[] tokens = line.split(SEMICOLON_DELIMITER);
//TODO: Noch auf Vollständigkeit der Zeile, Korrektheit der Datumsformate und ähnliches überprüfen
if ( tokens.length== maxLengthOfColumn && DateFormat.checkDateFormat(tokens[CURRENCY_PERIOD_START]) && DateFormat.checkDateFormat(tokens[CURRENCY_PERIOD_END])) {
//format currency value in csv
tokens[CURRENCY_VALUE]=tokens[CURRENCY_VALUE].replace(",", ".");
IataExchangeRateData iataExchangeRateData = new IataExchangeRateData(
new BigDecimal(tokens[CURRENCY_VALUE]), tokens[CURRENCY_ISO_CODE],
formatter.parseStringToDate(tokens[CURRENCY_PERIOD_START]),
formatter.parseStringToDate(tokens[CURRENCY_PERIOD_END]));
exchangeRateDataSet.getExchangeRateDataSet().add(iataExchangeRateData);
}
}
}
catch (Exception e) {
System.out.println("Error in CsvFileReader");
e.printStackTrace();
} finally {
try {
fileReader.close();
} catch (IOException e) {
System.out.println("Error while closing fileReader !!!");
e.printStackTrace();
}
}
}
}
干净的代码问题通常会引发争论,有些正确,有些则不太正确。但是我已经感觉到你现在对常量的处理方式,并且我已经按照你在代码中所做的方式使用它们,即在构造函数之上。但最近,我将它们放在 interface
中。有点像这样
public interface CurrencyConstants {
int CURRENCY_VALUE = 1;
int CURRENCY_ISO_CODE = 2;
int CURRENCY_PERIOD_START = 3;
int CURRENCY_PERIOD_END = 4;
}
然后我简单地导入接口并像这样使用常量..
CurrencyConstants.CURRENCY_VALUE
如果在多个 class 中使用常量,这会有所帮助。干杯!
- 如果任何属性用于方法内部的计算或操作,则仅在方法内部使用该属性。
- 如果正在使用任何属性使得任何方法都可以引用它,则在所有方法的顶部使用它。
- 如果任何属性不依赖于 class,例如计算特定对象的线程数,则通过将其设为静态将其用作 class 变量。