Search code examples
javacoding-stylerefactoring

Where to place constant attributes?


I want to write clean code in java and I am very insecure where to place my attriutes.

I often cannot decide, if I place them on top of the class, in a constructor or directly in the method. Are there some rules out there? The only logic one for me is, to place attributes on top of the class when these attributes are used in more than one method.

Can you evaluate this code in terms of clean code? Should I place the constant currency attributes in the constructor? Can I also put some of the class attributes in a method? Thanks for the advice

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();
            }
        }
    }
}

Solution

    1. If any attribute is used for calculation or manipulation inside a method then use that attribute inside only the method.
    2. If any attribute is being used such that any method can refer it then use it at the top of all the methods.
    3. If any attribute does not depend on the class specifically like counting the number of threads of a particular object then use it as a class variable by making it static.