Я вижу как минимум два нарушения правил POJO с указанным классом данных.
1) У класса есть открытый конструктор без аргументов
По умолчанию Kotlin не будет генерировать перегрузки для функций со значениями параметров по умолчанию ( https://kotlinlang.org/docs/reference/ java-to-kotlin-interop.html # overloads-generation )
Таким образом, ваш скомпилированный класс будет иметь только один конструктор с двухпараметрическим конструктором, и конструктор без аргументов не будет создан. Чтобы заставить компилятор Kotlin генерировать множественные перегрузки, нужно использовать аннотацию @JvmOverloads
. В вашем случае это будет использоваться в конструкторе, поэтому нам также нужно добавить ключевое слово constructor
:
data class SomeDataClass @JvmOverloads constructor
2) Все нестатические, не переходные поля в классе являются либо общедоступными (и не final) или иметь общедоступные методы получения и установки, которые следуют соглашениям об именах Java-бинов.
Поскольку вы используете ключевые слова val
, сгенерированные поля будут final
, и для них не будет сгенерировано никакого установщика. Таким образом, вы можете изменить val
на var
с, и поля больше не будут final
, а также будут генерироваться правильные методы получения и установки. (Или вы можете использовать другую аннотацию, чтобы предотвратить создание геттеров и сеттеров и выставить поле таким, как оно есть https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields ])
Таким образом, окончательный код должен быть таким:
data class SomeDataClass @JvmOverloads constructor(
var topic: String = "",
var message: String = ""
)
Вот решение, которое не использует Perl. Это работает оба с ksh
и sh
.
#!/bin/ksh
diff=-1
[ `date +%u` == 1 ] && diff=-3
seconds=$((`date +%s` + $diff * 24 * 3600))
format=+%Y-%m-%d
if date --help 2>/dev/null | grep -q -- -d ; then
# GNU date (e.g., Linux)
date -d "1970-01-01 00:00 UTC + $seconds seconds" $format
else
# For BSD date (e.g., Mac OS X)
date -r $seconds $format
fi
Ну, если рабочий Perl рассчитывает как часть сценария, затем разработайте ответ в Perl. Следующий вопрос - что определяет рабочий день? Действительно ли Вы - магазин/хранилище, который является, открывают на Sunday? В субботу? Или 9-5 с понедельника по пятницу бизнес? Что относительно праздников?
Принятие Вы думаете с понедельника по пятницу и праздники, является временно несущественным, затем можно использовать алгоритм в Perl, который отмечает, что wday будет 0 в воскресенье до 6 в субботу, и поэтому если wday будет равняться 1, необходимо вычесть 3 * 86400 со времени (); если wday 0, необходимо вычесть 2 * 86400; и если wday равняется 6, необходимо вычесть 1 * 86400. Это - то, что Вы вошли в материал оболочки Korn - просто делают это в Perl вместо этого:
#!/bin/perl -w
use strict;
use POSIX;
use constant SECS_PER_DAY => 24 * 60 * 60;
my(@days) = (2, 3, 1, 1, 1, 1, 1);
my($now) = time;
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
print strftime("%Y-%m-%d\n", localtime($now - $days[$wday] * SECS_PER_DAY));
Это действительно предполагает, что у Вас есть модуль POSIX; в противном случае затем необходимо будет сделать примерно тот же printf (), как Вы использовали. Я также использую формат ISO 8601 для дат предпочтением (также используемый XSD и SQL) - следовательно проиллюстрированный формат.
#!/bin/ksh
# GNU date is a veritable Swiss Army Knife...
((D=$(date +%w)+2))
if [ $D -gt 3 ]; then D=1; fi
PREV_DT=$(date -d "-$D days" +%F)
This should work for Solaris and Linux. It's realy complicating on Unix that you can not use the same commandline arguments on all Unix derivates.
On Linux you can use date -d '-d24 hour ago'
to get the last day
on Solaris its TZ=CET+24 date
. I guess other UNIX'es works the same way as Solaris does.
#!/usr/bin/ksh
lbd=5 # last business day (1=Mon, 2=Thu ... 6=Sat, 7=Sun)
lbd_date="" # last business day date
function lbdSunOS
{
typeset back=$1
typeset tz=`date '+%Z'` # timezone
lbd_date=`TZ=${tz}+$back date '+%Y%m%d'`
}
function lbdLinux
{
typeset back=$1
lbd_date=`date -d "-d$back hour ago"`
}
function calcHoursBack
{
typeset lbd=$1
typeset dow=`date '+%u'` # day of the week
if [ $dow -ge $lbd ]
then
return $(((dow-lbd)*24))
else
return $(((dow-lbd+7)*24))
fi
}
# Main
calcHoursBack $lbd
lbd`uname -s` $?
echo $lbd_date