2016-03-20 3 views
1

Каков предпочтительный метод двух ниже, когда речь идет о преобразовании объектов?Шаблоны проектирования и соглашения для преобразования объектов

преобразования

объекта с использованием метода ASX()

public class Foo { 
    int foo; 
    public Bar asBar() { 
    return new Bar(foo); 
    } 
} 

class Bar { 
    int bar; 
    public Bar(int bar) { 
    this.bar = bar; 
    } 
} 

преобразования объекта с помощью конструктора

public class Foo { 
    int foo; 
} 

class Bar { 
    int bar; 
    public Bar(int bar) { 
    this.bar = bar; 
    } 

    public Bar(Foo foo) { 
    this.bar = foo.foo; 
    } 

} 

я не уверен в достоинствах любого метода (в отношении ремонтопригодности, масштабируемости и др .c), по сравнению с другим. Каков установленный стандарт?

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

+0

Вы должны возложить ответственность за преобразование в другой объект. Что делать, если вы хотите конвертировать 'Foo' в другой тип, отличный от' Bar'? В конечном итоге вы получаете множество методов преобразования в своем классе. Не только это, это нарушит принцип O/C, если позже вы решите добавить другие методы преобразования. –

+0

В дополнение к 3 подходам, предложенным до сих пор, вы также можете использовать метод 'static' для преобразования. Я думаю, что этот вопрос очень широк, и нет правильного ответа. –

+0

@VinceEmigh Не помешал бы это пространство имен, введя класс, который используется исключительно для преобразования между объектами. Я имею в виду для меня использовать такие методы преобразования в любом из классов, которые преобразуются в/из. – SamTebbs33

ответ

1

Что я видел много, и мне лично нравится стиль, используемый многими JDK, который включает статический заводский метод в целевом классе. Конечной целью является упрощение чтения кода.

Например:

Integer.fromString("42") 

кредитование из примера в OP:

public class Foo { 
    int foo; 
} 

class Bar { 
    int bar; 

    public static Bar fromFoo(Foo foo) { 
    return new Bar(foo.foo); 
    } 

    public Bar(int bar) { 
    this.bar = bar; 
    } 

} 

Таким образом кто-то может создать Bar из Foo и код хорошо читается при этом:

Bar bar = Bar.fromFoo(foo); 

Он читается почти как английский, не будучи COBOL!

Смежные вопросы