通用的getter和setter方法

时间:2014-07-21 07:28:24

标签: java generics setter getter getter-setter

我正在尝试编写一个抽象类。这个课将成为一个领域。将有不同类型的字段需要扩展字段类并编写自己的setter类。例如....将有一个字符串字段和一个整数字段。

String Field需要扩展Field类,但必须拥有自己的setValuegetValue方法,该方法具有要设置和返回的String变量。 Number Field必须对Integer执行相同的操作。

我认为最好的方法是在超类中使用Generic Type设置Value,但我不知道该如何处理。任何帮助非常感谢。

6 个答案:

答案 0 :(得分:1)

你可以让你的超级类通用:

public abstract class Field<T>{
  private T value;

  public void setValue(T value){
     this.value = value;
  }

  public T getValue(){
     return value;
  }
}

如果您现在扩展它:

public class StringField extends Field<String>{
   //nothing to do here.
}

你已经完成了。

答案 1 :(得分:1)

像这样:

public abstract class Field<T> {
    private T value;
    // + constructor(s)
    public T get() {
        return value;
    }
    public void set(T value) {
        this.value = value;
    }
}

public class StringField extends Field<String>{}
public class IntField extends Field<Integer>{}

您可能希望添加Field(T value)StringField(String s)等构造函数。

答案 2 :(得分:1)

这对于熟悉泛型来说似乎是一种非常好的做法。现在有很多教程可供使用,所以我会尝试解释一下发生了什么,然后我会敦促你们查看其中的一些。

基本上,您可以将泛型视为在运行时告诉您的对象它将具有哪种类型的方式,这是<>中的类型。

因此ArrayList<String>将是包含类型String的ArrayList。所以回到你要做的事情就是让你的Field类通用。

这可以通过以下方式轻松完成:

public class Field<T> {
    private T field;
}

现在,当您创建Field类的实例时,比如说String,您只需编写:

Field<String> f = new Field<>();

要编写与运行时期间决定的类型相同类型的通用getter,您将执行以下操作:

public class Field<T> {
    private T field;

    public T getField() { return field; }
}

我将为你制作一个制定者作为练习。

请记住,在这种情况下,TField在运行时获取的类型的占位符。

答案 3 :(得分:1)

基本实施

public abstract class Field<T> {
    private T value;
    // + constructor(s)
    public T get() {
        return value;
    }
    public void set(T value) {
        this.value = value;
    }
}

public class StringField extends Field<String>{}
public class IntField extends Field<Integer>{}

了解详情请访问此link link2

答案 4 :(得分:1)

我认为你所建议的是完全合理的,它看起来像这样:

public class Field<T extends Object> {

    private T value;

    public Field(final T value) { 
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public void setValue(final T value) {
        this.value = value;
    }
}

请注意,我故意将此作为摘要。除非您确实希望为特定字段类型实现额外功能,否则无需将其用作超类。因此,您可以像这样定义Sting Fields和Number Fields:

Field<String> stringField = new Field<String>();
Field<Integer> numberField = new Field<Integer>();

当然,如果您确实需要在Field的类型化版本中进行额外的实现,那么请将其抽象化并定义您的子类,如下所示:

public class StringField extends Field<String> {
    public StringField(final String value) {
        super(value);
    }
}

public class NumberField extends Field<Integer> {
    public NumberField(final Integer value) {
        super(value);
    }
}

答案 5 :(得分:0)

public abstract class MyClass<T>{
  private T field;

  public T getField(){
    return field;
  }

  public void setField(T field){
    this.field = field;
  }
}


public class MyClassWithString extends MyClass<String>{}