2016-09-06 7 views
2

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

Так I've получил абстрактный классFoo, который имеет Ломбок аннотацию @Data:

@Data 
public abstract class Foo{ 

private String id; 
protected BoundType type; 

public abstract void setBoundType(BoundType boundType); 
} 

Вот перечисление BoundType:

public enum BoundType { 

    IN, OUT; 
} 

И I've получил еще два классы, InFoo и OutFoo, которые распространяются на Foo. boundTypeInFooвсегда должен быть перечисляемым типом IN. С другой стороны, boundType в OutFooвсегда должен быть перечисляемым типом OUT. Например:

@Data 
public class InFoo extends Foo{ 

public void setBoundType() { 
    //ALWAYS HAS TO BE BoundType.IN 
} 
} 

Как я могу обеспечить соблюдение этого? Не знаете, как его проектировать. Заранее спасибо.

+0

ISN» Это будет хорошо, если мы определим BouudType как приватную переменную в классе InFoo и не выставим его getter и setter? –

+0

Не нарушаете принцип наследования, позволяя подклассу определить тип? –

+1

да, но все, как мы вынуждаем значение, должны быть IN или OUT, поэтому я думаю, что не имеет смысла подвергать свой сеттер своему ребенку, потому что даже с установщиком нам нужно ограничить дочерние элементы заданием определенного значения только –

ответ

2

Убедитесь, что конструктор устанавливает правильное значение для каждого подкласса, а затем убедитесь, что нет установочного устройства, так что нет возможности изменить значение.

Также см. Это сообщение Omitting one Setter/Getter in Lombok о том, как опустить сеттер для поля BoundType.

+0

Огромное спасибо, я фактически обеспечил доступ к сеттерам с помощью Lombok, но не уверен, как это сделать на самом деле. Не могли бы вы добавить код? –

+0

Ну, я не могу проверить это сейчас, но, насколько я вижу, все, что вам нужно сделать, это добавить @Setter (AccessLevel.NONE) перед защищенным типом BoundType в вашем классе Foo, что означает, что Ломбок не создаст сеттер для этого поля (это то, что вы хотите). – Brumlebarten

+0

Я сделал какое-то соединение между вашим ответом и ответом @Beethoven, но даже я использую аннотацию AllArgsConstructor в Foo, я не могу использовать супер в InFoo и OutFoo, он не распознается. Любой намек? Я новичок в Lombok –

1

Правильное значение должно быть установлено в конструкторе подклассов:

public InFoo() { 
    boundType = BoundType.IN; 
} 

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

public void setBoundType(BoundType boundType) { 
    if(boundType != BoundType.IN) 
     throw new IllegalArgumentException(); 
    this.boundType = boundType; // This line is actually unnecessary 
} 
+0

Если я это сделаю, будет ли смысл сохранять абстрактный класс? –

+0

Да, если нет смысла создавать экземпляры 'Foo' напрямую, но только его подклассы. – Beethoven

+0

Действительный пункт там –

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