Я изучаю Java самостоятельно и начал работать с интерфейсами.Я использую учебник под названием Big Java Early Objects от Cay Horstmann.Я наткнулся на упражнение, которое мне довольно трудно понять.В упражнении говорится:
Метод System.out.printf имеет предопределенные форматы для печати целых чисел, чисел с плавающей запятой и других типов данных.Но это также расширяемо.Если вы используете формат S, вы можете напечатать любой класс, который реализует интерфейс Formattable.Интерфейс имеет единственный метод:
void formatTo(Formatter formatter, int flags, int width, int precision)
В этом упражнении класс BankAccount должен реализовывать интерфейс Formattable.Игнорируйте флаги и точность и просто форматируйте баланс банка, используя заданную ширину.Чтобы выполнить эту задачу, вам нужно получить ссылку на «Добавляемый», например:
Appendable a = formatter.out();
Добавляемый - это еще один интерфейс с методом
void append(CharSequence sequence)
CharSequence - еще один реализованный интерфейс(среди прочих) классом String.Создайте строку, сначала преобразовав баланс банка в строку, а затем добавив в нее пробелы, чтобы она имела желаемую ширину.Передайте эту строку в метод append.
Я дошел до того, что в классе тестера я создаю и экземпляр объекта BankAccount с 1500 долларов в нем.Вызов System.out.printf("%s", account)
дает мне 1500. Однако я должен получить параметр ширины для добавления отступов, и я не знаю, как заставить это работать.
Кроме того, код, который у меня нет 'не имеет смысла для меня.Я написал код, следующий за описанием упражнения, но я не знаю, как он работает.
public class BankAccount implements Formattable
{
private String name;
private double balance;
/**
Constructs a bank account with a zero balance.
*/
public BankAccount()
{
this.name = "";
this.balance = 0;
}
/**
Constructs a bank account with a given balance.
@param initialBalance the initial balance
*/
public BankAccount(String name, double initialBalance)
{
this.name = name;
this.balance = initialBalance;
}
/**
Deposits money into the bank account.
@param amount the amount to deposit
*/
public void deposit(double amount)
{
balance = balance + amount;
}
/**
Withdraws money from the bank account.
@param amount the amount to withdraw
*/
public void withdraw(double amount)
{
balance = balance - amount;
}
/**
Gets the current balance of the bank account.
@return the current balance
*/
public double getBalance()
{
return balance;
}
public String getName()
{
return this.name;
}
public void formatTo(Formatter formatter, int flags, int width, int precision)
{
Appendable a = formatter.out();
String padding = "";
for(int i = 0; i < width; i++)
{
padding = padding.concat(" ");
}
String bankBalance = padding + String.valueOf(getBalance());
try
{
a.append(bankBalance);
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Выше приведен мой класс BankAccount, который реализует Formattable и определяет метод formatTo.Я не понимаю, что делает Appendable a = formatter.out
.И как вызов a.append(bankBalance)
позволяет мне использовать System.out.printf(%s, account);
в моем классе тестеров.
Ниже приведен мой класс тестеров.
public class FormatTester
{
public static void main(String[] args)
{
BankAccount account = new BankAccount("Bob Robert", 1500);
System.out.printf("%s", account);
}
}
Это печатает 1500 без заполнения.Я знаю, что там нет заполнения, потому что параметру width не присваивается значение типа int.Я не знаю, как установить его, потому что, если я пытаюсь сделать это:
public class FormatTester
{
public static void main(String[] args)
{
BankAccount account = new BankAccount("Robert Bob", 1500);
Formatter formatter = new Formatter();
System.out.printf("%s", account.formatTo(formatter, 0, 5, 0);
}
}
Он жалуется, говоря:
Метод printf (String, Object ...)в типе PrintStream не применяется для аргументов (String, void)
Если я не могу установить ширину таким образом, как я смогу это сделать?Кстати, имя не имеет значения.Я пытался отформатировать имя, но решил придерживаться только баланса.