Java инициализирует класс в стиле, как в С#

Я неплохо разбираюсь в Java, потому что я работаю разработчиком C# на полную ставку, но мне нужно сделать какой-нибудь частный проект на Android.

В С# я могу сделать что-то вроде этого:

public class Test
{
    public string A {get;set;}
    public OtherClass B {get;set;}
}

public OtherClass ()
{
    string Some {get;set;}
    string Again {get;set;}
}

Теперь, когда я хочу использовать тест класса, я могу сделать такой код:

var test = new Test
{
    A = "test",
    B = new OtherClass
    {
        Some = "Some",
        Again = "Again"
    }
};

Благодаря этому теперь я четко инициализировал тест.

Когда я хочу сделать это на Java, я должен сделать код вроде:

public class Test
{
    private string A;
    public string GetA()
    {
        return A;
    }
    public void SetA(string a)
    {
        A = a;
    }

    privte  OtherClass B;
    public OtherClass GetB()
    {
        return B;
    }
    public void SetB(OtherClass b)
    {
        B = b;
    }
}



public class OtherClass
{
    private string Some;
    public string GetSome()
    {
        return Some;
    }
    public void SetSome(string some)
    {
        Some = some;
    }

    privte  string Again;
    public string GetAgain()
    {
        return Again;
    }
    public void SetAgain(string again)
    {
        Again = again;
    }
}

Я знаю, что Java должен иметь Seter и Geter для поля, и я согласен с этим, но теперь, если я хочу использовать объект Test так же, как я использую его в C #, я должен сделать что-то вроде:

OtherClass otherClass = new OtherClass();
otherClass.SetSome("Some");
otherClass.SetAnothier("Another");
Test test = new Test();
test.SetA("A")
test.SetB(otherClass);

ИМО это не очень хорошая и четкая декларация. Я знаю, что могу добавить конструктор, например:

public Test(string a, otherClass b)
{
    A = a;
    B = b;
}

а также

public OtherClass(string some,string another)
{
     Some = some;
     Another = another;
}

И используйте его как:

Test test = new Test("Test",new OtherClass("some","Another"));

Но когда у меня есть более сложные классы (например, с полем 200 (да, у меня есть это)) конструктор будет очень длинным, и его будет трудно прочитать.

Итак, могу ли я инициализировать класс в Java другим способом, который я вам показываю?

Благодарить


person Aht    schedule 05.02.2016    source источник


Ответы (1)


Вы также можете использовать object initializers в java, однако они называются double brace initializers. Пример:

Test test = new Test()
{{
    SetA("test");
    SetB(new OtherClass()
    {{
        SetSome("Some");
        SetAgain("Again");
    }});
}};

Однако вам, вероятно, не следует использовать это, поскольку оно имеет некоторые странные/неожиданные побочные эффекты. Этот пример создает AnonymousInnerClass для Test и OtherClass. Подробнее об инициализаторах с двойными скобками можно прочитать здесь.

Если у вас больше параметров, чем вы хотите передать конструктору, вы можете использовать шаблон построителя, как предложено в этом ответе.

person Simon Karlsson    schedule 05.02.2016
comment
Похоже, это я и искал. Эти двойные скобки меня немного пугают, потому что количество скобок может сделать ошибку поиска еще хуже, особенно когда объект инициализируется в какой-то функции :) Но это выглядит идеально для меня. Это требует меньше ресурсов, чем метод, который я показываю в своем посте? - person Aht; 05.02.2016
comment
Это требует гораздо больше ресурсов — каждый объект, который вы создаете таким образом, имеет свой собственный класс. - person Pete Kirkham; 05.02.2016
comment
На самом деле это неправильное использование анонимных внутренних классов, ставшее популярным благодаря людям, которые действительно хотят, чтобы Java выглядела как C#. - person Dave Doknjas; 05.02.2016
comment
@Aht: Основная проблема не должна быть косметической проблемой - вашей главной заботой должен быть код, выполняющий то, что нужно сделать - в этом случае происходит создание экземпляра скрытого класса, который здесь не имеет никакого отношения. - person Dave Doknjas; 06.02.2016
comment
@DaveDoknjas: Так что я запомню это решение, но постараюсь его избежать. - person Aht; 06.02.2016