如何创建类的对象

时间:2011-04-10 05:24:53

标签: java

我认为这足以解释我的问题:

public class Model {
    public static Model [] findAllBySQL(String SQL){
        //this is simplified.  It should really query the DB and then fill model(s) with the DB values, and return the model(s).  sql query can return more than one row
        return new this(); //sytax error here
    }
}


public class UserModel extends Model {

}


UserModel.findAllBySQL("firstname=john") //How do I design the above so this returns a UserModel object?

我对Java比较陌生。我的背景主要是PHP。我正在尝试创建一个简单的自制活动记录系统..我知道这是重新创建的轮子,但这就是我学习的方式:)。

编辑:大多数人都误解了我。我知道如何简单到new UserModel()。我更改了代码以使其更清晰。

6 个答案:

答案 0 :(得分:2)

为什么不简单地使用new运算符

UserModel userModel = new UserModel();

要了解在java中创建对象的不同方法,请参阅以下主题:what-are-all-the-different-ways-to-create-an-object-in-java


修改

根据您的编辑,您可以做什么?

public static Model findBySQL(String SQL){
        Model model = new Model();
        // Now query in db to get data. then use setter methods of Model to set data in object
        // i.e. model.setXXX(XXX);
        // and finally return that model object.
        return model;
    }

修改2

  

UserModel可能有getFullName()   将名字与。连接起来   数据库中的姓氏。我会   需要能够访问此方法   直接回来的对象   来自findBySQL

您可以尝试这样:在UserModel中,

public String getFullName(){
    Model model = findBySql("str='str'");
    return model.getFirstName()+"  "+model.getLastName();
}

答案 1 :(得分:1)

您应该使用构造函数:

public class Model {
    //Constructor
    public Model()
    {
    // Do initialization stuff here
    }
}


public class UserModel extends Model {
    //Constructor
    public UserModel()
    {
    // Do initialization stuff here
    }
}

要创建新对象,请按以下方式调用:

UserModel myUserModel;    // Declare new object reference
myUserModel = new UserModel();   // create new object of this class

编辑:

如果您将方法声明为返回Model数组的方法,则无法返回单个模型,您可能会返回Model个数组,其中包含一个Model,但不会单个对象。

例如

public static Model [] findAllBySQL(String SQL){
    // find how many models do you have
    Model[] models = new Model[numberOfModels];
    for (Model model : models)
    {
         model = new Model();
         //do what you want with it...
    }
    return models; //sytax error here
}

答案 2 :(得分:1)

听起来你需要Factory Method Pattern。如果您有Model超类和几种类型的模型,那么您可以使用createModel()方法将对象创建封装在ModelFactory类中,该方法根据方法的参数返回相应类型的Model。

 class ModelFactory(){
       public Model createModel(String sql, String type){
            //execute SQL

            if(type.equals("user")){
                 UserModel model = new UserModel();
                 //set the attributes here
                 return model;
            }

            if(type.equals("other")){
                 OtherModel model = new OtherModel();
                 //set attributes here
                 return model;
            }

             //etc
       }
 }

要实际获取Model对象,您现在可以:

       ModelFactory factory = new ModelFactory();
       Model m = factory.createModel("select * from mytable", "user");

答案 3 :(得分:0)

这就是你如何使用这个

UserModel m = new UserModel();

UserModel现在具有来自UserModel的所有函数/值+来自Model的函数/值。

实施例

public class Model {
    public Model()
    {
    // Do initialization stuff here
    }

    public getVal(){
        return 1+1;
    }
}


public class UserModel extends Model {
    public UserModel()
    {
    // Do initialization stuff here
    }

    public getValue2(){
        return 2+2;
    }
}


UserModel m = new UserModel();

m.getVal(); //Will return 2
m.getValue2(); // Will return 4

答案 4 :(得分:0)

你可以这样做:

import java.util.ArrayList;
import java.util.List;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;

public class Generics<T> {

    //method that returns a generic list
    public List<T> findAllBySQL(String SQL) {
        throw new NotImplementedException();
    }

    public static void main(String[] args) {
        //base class that returns a list of childs
        Generics result = new ExtendedGenerics(null);
        List<ExtendedGenerics> genericArray = result.findAllBySQL(null);
        for (ExtendedGenerics item : genericArray) {
            System.out.println(item);
        }
    }
}

//extend base class and specify generic type
class ExtendedGenerics extends Generics<ExtendedGenerics> {

    private String myMessage;

    public ExtendedGenerics(String yourMessage) {
        myMessage = yourMessage;
    }

    @Override
    //overriding base method, so it return a instances list of this class 
    public List<ExtendedGenerics> findAllBySQL(String SQL) {
        ArrayList<ExtendedGenerics> result = new ArrayList<ExtendedGenerics>();
        result.add(new ExtendedGenerics("I am first"));
        result.add(new ExtendedGenerics("I am second"));
        result.add(new ExtendedGenerics("I am third"));
        return result;
    }

    @Override
    public String toString() {
        return "ExtendedGenerics{" + myMessage + '}';
    }
}

所以这样就没有必要的铸造了。 这是代码的输出:

ExtendedGenerics{I am first}
ExtendedGenerics{I am second}
ExtendedGenerics{I am third}

答案 5 :(得分:0)

您可以使用Factory MethodJava Generics

public class Model {
  public static <T> T[] findAllBySQL(String SQL, Class<T extends Model> type) {
    T[] result = new T[123];
    for (int i = 0; i < 123; i++) {
      result[i] = type.newInstance();
    }
    return result;
  }
}
public class UserModel extends Model {
}
Model[] rowset = UserModel.findAllBySQL("firstname=john", UserModel.class); 

我认为这是简单的PHP构造的替代方法:

new $type();