Закрытое статическое поле Java и анонимные внутренние классы против Kotlin const val и объектных выражений / объявлений

мой рабочий код. Возвращает utf8 xml разрешает пустое пространство имен.

// override StringWriter
public class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding => Encoding.UTF8;
}

private string GenerateXmlResponse(Object obj)
{    
    Type t = obj.GetType();

    var xml = "";

    using (StringWriter sww = new Utf8StringWriter())
    {
        using (XmlWriter writer = XmlWriter.Create(sww))
        {
            var ns = new XmlSerializerNamespaces();
            // add empty namespace
            ns.Add("", "");
            XmlSerializer xsSubmit = new XmlSerializer(t);
            xsSubmit.Serialize(writer, obj, ns);
            xml = sww.ToString(); // Your XML
        }
    }
    return xml;
}

Пример возвращает ответ Yandex api payment Aviso url:

<?xml version="1.0" encoding="utf-8"?><paymentAvisoResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" performedDatetime="2017-09-01T16:22:08.9747654+07:00" code="0" shopId="54321" invoiceId="12345" orderSumAmount="10643" />
0
задан Android Fan 3 March 2019 в 01:43
поделиться

1 ответ

Обратите внимание на разницу между выражением объекта и объявлением объекта.

  • val poodle = object: Dog { ... } является выражением объекта . Создает анонимный объект. Это эквивалентно написанию Dog poodle = new Dog() { ... } на Java.
  • object Poodle: Dog { ... } является объявлением объекта . Он создает одноэлементный объект и примерно эквивалентен созданию класса Java, который ограничен только одним экземпляром.

Документация Kotlin гласит, что свойства const val должны быть «верхнего уровня, или элементом объявления объекта, или объекта-компаньона». ( https://kotlinlang.org/docs/reference/properties.html#compile-time-constants ). Они недопустимы в объектных выражениях.

Следующее объявление объекта должно работать нормально:

object Poodle : Dog {
    private const val POODLE_FASHION = ...

    override fun walk() {
        ...
    }
}

Одна важная причина различия состоит в том, что выражение объекта не объявляет новый тип (хотя, в терминах Java, это приводит к анонимный класс).

  • val poodle = object: Dog { ... } создает переменную типа Dog. Нет такого типа, как Poodle.
  • object: Poodle: Dog { ... } создает объект типа Poodle. Это новый тип, который является подтипом Dog.

Это различие важно, потому что в Kotlin свойство const val всегда принадлежит типу. MyClass.MY_CONST_VAL является действительным, но доступ к нему как MyClass().MY_CONST_VAL является ошибкой и не будет работать. В результате свойство const val анонимного объекта всегда будет эффективно приватным для этого объекта.

Я не вижу технической причины, по которой было бы невозможно разрешить свойства const val для анонимных объектов (поля констант времени компиляции static final разрешены во внутренних классах Java), но их полезность была бы крайне ограничено, и это просто не является частью спецификации языка Kotlin.

0
ответ дан Sam 3 March 2019 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: