Concatenation
При склеивании нескольких строк через код, сцепить их. В Java существует несколько способов сделать это.
Знак +
объединяет String
объектов. Каждый объект String
является immutable, что означает, что вы не должны изменять («мутировать») его значение. Вместо этого создается новый экземпляр, объединяющий исходное значение и вновь добавленный объект String.
String message = "My name is ";
message = message + "Basil";
message = message + ".";
System.out.println(message); // My name is Basil.
Другой способ заключается в вызове append
на объект любого класса, который реализует интерфейс Appendable
.
StringBuilder
соответствует Appendable
, соответствующему вашей ситуации.
StringBuilder message = new StringBuilder("My name is ");
message.append("Basil");
message.append(".");
System.out.println(message.toString()); // My name is Basil.
Оговорка: Используйте StringBuilder
только там, где thread-safety не является проблемой. Когда ваш объект Appendable
может быть доступен через несколько потоков, вместо этого используйте StringBuffer
.
Для получения дополнительной информации о различных видах связанных с строкой объектов с отличной диаграммой, чтобы их понять, см. my Answer на вопрос, Exact difference between CharSequence and String in java.
DayOfWeek
DayOfWeek
enum имеет семь экземпляров, по одному на каждый день недели. Получение сегодняшнего дня недели означает получение сегодняшней даты, и для этого требуется часовой пояс. В любой данный момент дата изменяется по всему миру по зонам.
ZoneId z = ZoneId.of("America/Montreal");
LocalDate today = LocalDate.now(z);
DayOfWeek dow = DayOfWeek.from(today); // `dow` is an *object*, not mere text like `Monday` or mere integer number like `1`.
Использование объектов этого enum, а не простые целые числа для представления в день, из недели делает ваш код более самодокументирован, обеспечивает type-safety, и обеспечивает действительные значения.
Определить текстовый объект вне Блок переключателей
Основная проблема в коде Вопрос в том, что переменная держит строку определяется внутриswitch
case
; эта переменная выходит из сферы действия после выхода из switch
case
и сразу же становится кандидатом на garbage collection (ваш строковый объект уходит и уничтожается, очищается от памяти, другими словами), прежде чем вы когда-либо получили возможность конкатенации или печати текстового содержимого ,
Так этот код:
switch (dayCurrent) {
case 0:
String today_sun = "Today is Sunday";
break;
case 1:
String today_mon = "Today is Monday";
break;
…
... должно быть:
String today = null;
switch (dayCurrent) {
case 0:
today = "Today is Sunday";
break;
case 1:
today = "Today is Monday";
break;
…
Но, даже лучше, мы можем заменить этот String
объект с Appendable
: StringBuilder
.
StringBuilder
Когда конкатенации больше, чем несколько строк, и безопасности потоков не является проблемой в вашем контексте, используйте StringBuilder
класс.
Обратите внимание, что мы определяем этот StringBuilder
объект с именем message
внеswitch
блока. Определение за пределами switch
означает, что объект выживает, существует до, во время и после того, как коммутатор выполняет свою работу.
StringBuilder message = new StringBuilder();
switch (dow) {
case DayOfWeek.MONDAY:
case DayOfWeek.TUESDAY:
case DayOfWeek.WEDNESDAY:
case DayOfWeek.THURSDAY:
case DayOfWeek.FRIDAY:
message.append("Weekday - Working for a living. ");
break;
case DayOfWeek.SATURDAY:
case DayOfWeek.SUNDAY:
message.append("Wohoo! Weekend… Party on Garth! ");
break;
default:
System.out.println("ERROR - Unexpectedly reached case DEFAULT on value for DayOfWeek 'dow'.");
}
dayFuture
часть вашего кода не имеет смысла для меня, и, кажется, не имеет отношения к вашему вопросу о склеиванием текста через нескольких switch
блоков. Поэтому я буду использовать перехват whatever
.
switch (whatever) {
case thisThing:
message.append("Use vanilla.");
break;
case thatThing:
message.append("Use chocolate.");
break;
case theOtherThing:
message.append("Use almond.");
break;
default:
System.out.println("ERROR - Unexpectedly reached case DEFAULT on value for whatever.");
}
Теперь мы создали сообщение из нескольких компонентов. Мы можем вывести это значение до System.out
.
System.out.println(message.toString()); // Outputs day-of-week text combined with flavor text.
Будни - Работа для жизни. Используйте шоколад.
Дата математика
Что касается добавления дней к дате, чтобы получить другую дату, просто назвать plus…
или minus…
методы.
Если пользователь вводит строку цифр, проанализируйте ее как число для количества дней, которое нужно добавить.
Integer days = Integer.valueOf("4");
Добавить это количество дней.
LocalDate future = today.plusDays(days);
Если проходит вокруг этого истекшего времени, использовать TemporalAmount
такие как Period
или Duration
объект, а не просто целым числом.
Period period = Period.ofDays(days);
LocalDate future = today.plus(period);
Чтобы увидеть, что будущий Дейт дня-неделю, принесите объект DayOfWeek
перечислимых. Нет необходимости в коммутаторе.
DayOfWeek dow = DayOfWeek.from(future);
Вы можете задать DayOfWeek
его локализованное название. Звоните DayOfWeek::getDisplayName
. Перейдите TextStyle
, чтобы указать длину или аббревиатуру. И передайте Locale
, чтобы указать человеческий язык для перевода и культурные нормы для решения таких вопросов, как пунктуация и порядок частей.
String dowName =
dow.getDisplayName(
TextStyle.FULL_STANDALONE ,
Locale.CANADA_FRENCH);
Почему вы не ставите операторы sysout в свои шкафы-переключатели – mhasan
Какова точка объявления переменных в блоках 'case'. Они будут ограничены по охвату этими блоками (т. Е. Не видны вне этих блоков кода). Что такое dayFuture и где определено. Почему бы не сделать простые арифметические операции? –
Извините, это мой первый раз, используя этот сайт. Я попытался вставить весь свой код, и он не переводил хорошо, поэтому я отключил его. – NewProgrammerMR