Снятие шаблона для обертки класса в Котлин - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь реализовать обертку вокруг Java ArrayList.Он перенаправляет многие вызовы методов, такие как add, remove, removeIf, get, непосредственно в реализацию ArrayList.Этот класс Java содержит много шаблонов.

public class JSONArray extends JSONType implements Iterable<JSONType> {

    private ArrayList<JSONType> data = new ArrayList<>();

    public JSONType get(int i) {
        return data.get(i);
    }
        public JSONArray add(int i, JSONType j) {
        data.add(i, j);
        return this;
    }
    public JSONArray add(JSONType j) {
        data.add(j);
        return this;
    }
    public JSONArray add(int i, String j) {
        data.add(i, new JSONString(j));
        return this;
    }
    public JSONArray add(String j) {
        data.add(new JSONString(j));
        return this;
    }
    public JSONArray add(int i, Double j) {
        data.add(i, new JSONDouble(j));
        return this;
    }
    public JSONArray add(Double j) {
        data.add(new JSONDouble(j));
        return this;
    }
    public JSONArray add(int i, int j) {
        return add(i, (double) j);
    }
    public JSONArray add(int j) {
        return add((double) j);
    }
    public JSONArray add(int i, Boolean j) {
        JSONBoolean b = j ? JSONBoolean.True : JSONBoolean.False;
        data.add(i, b);
        return this;
    }
    public JSONArray add(Boolean j) {
        JSONBoolean b = j ? JSONBoolean.True : JSONBoolean.False;
        data.add(b);
        return this;
    }
    public JSONArray addNull(int i) {
        data.add(i, JSONNull.Null);
        return this;
    }
    public JSONArray addNull() {
        data.add(JSONNull.Null);
        return this;
    }

Есть ли способ убрать этот шаблонный код в kotlin?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

В Kotlin вы бы просто сделали это:

class JSONArray: JSONType, Iterable<JSONType> {

    private val data = mutableListOf<JSONType>();

    fun get(i: Int) = data.get(i)

    fun add(i: Int, j: JSONType) = data.add(i, j)
    fun add(j: JSONType) = data.add(j)
    // etc.
}

Это не сделает его быстрым API, но это не проблема в Kotlin, потому что вы можете использовать основные функции языка (with, apply например), чтобы избежать повторения переменной снова и снова.Например:

with(jsonArray) {
    add(foo)
    add(bar)
    add(0, baz)
}
0 голосов
/ 24 ноября 2018

ArrayList не является окончательным.Вы можете наследовать от него и переопределять только те методы, которые вам нужно изменить.

...