本例中Java的类结构

时间:2014-01-26 21:14:13

标签: java object api-design

我想首先指出我是Java的新手,所以请轻松一点。 :)

我有一个随机生成名称的方法。 我只是想知道是否更好的做法是直接调用带有返回类型的方法:

String personName = People.nameGen();

或者我最近学到的,创建'get'方法来获取'实例?'像这样的变量:

public String getName(){
return this.name;
}

然后:

String personName = Person1.getName();

我已经尝试了两种方式,它们看起来完全相同,我似乎无法理解为什么你会用另一种方式。

甚至直接调用实例变量..?

name = People.name; or something like that?

所有这些选项都会生成我在该方法中生成的人名的输出。

编辑,这就是我所拥有的:

import java.util.Random;
public class People {

int genderCode;
int age;
String gender;
String name;

public People(){
    genderCode = genderCode(); //I use genderCode for the nameGen method
}

public int genderCode(){
    Random randNum = new Random();      
    genderCode = randNum.nextInt(2);
    return genderCode;
}

public int age(){
    Random randNum = new Random();      
     age = 1+randNum.nextInt(80);
    return age;
}   

public String gender(){
    if (genderCode == 0 && age <=18) {
        gender = "girl";
    } else if (genderCode == 0 && age >18){
        gender = "woman";
    } else if (genderCode == 1 && age <=18){
        gender = "boy";
    } else if (genderCode == 1 && age >18){
        gender = "man";
    } 
    return gender;
}

public String nameGen() {
    String[] firstNameGirl = { "Lucy", "Marry", "Bonnie", "Clair" }; //More names will be added later
    String[] firstNameBoy = { "Bob", "Jacob", "William", "Nathan" };
    String[] lastName = { "Smith", "Brown", "Johnson" };

    Random randNum = new Random();

    if (genderCode == 0) {
        String girlName = firstNameGirl[randNum.nextInt(firstNameGirl.length)]+ " "+ lastName[randNum.nextInt(lastName.length)];
        name = girlName;
    } else if (genderCode == 1){
        String boyName = firstNameBoy[randNum.nextInt(firstNameBoy.length)]
                + " " + lastName[randNum.nextInt(lastName.length)];
        name = boyName;
    }
    return name;
}
}

然后对于主要人物,我只是想随意创造一个新人......例如:

System.out.println("You meet a " +age+ " year old " +gender+ " named " + name);

感谢所有快速解答!它们都是独一无二的信息!

4 个答案:

答案 0 :(得分:0)

我会将标准访问器方法(getter / setter)保留为访问字段的默认目的,并创建另一个名为

的类
class PersonUtils{

    public static String getRandomName(){
      // code
    }
}

答案 1 :(得分:0)

使用此:

private Person () 
{private String name;

private void setName(String name ) {
this.name=name;
}
private getName(){
this.name=name;
return name;
}

}

答案 2 :(得分:0)

问自己的问题是People类(或Person1类 - 你似乎使用了不同的名字)的工作或责任是什么,以及有多少外部资源,协调和时间它需要吗?这些问题还应引导您检查:您的班级是否需要保留姓名或其他任何内容?换句话说,生成这个名字贵吗?你只需要一次名字吗?您需要共享一个名称,还是需要针对不同用户或线程或其他名称使用不同的名称?

例如,如果您的方法通过简单地迭代和几次调用Math.random()来创建一个随机名称,并且您每次都想要一个不同的名称,这听起来很适合静态实用程序类:

public final NameUtils {
    private final NameUtils() {} // only allow access to static methods

    // 2 consecutive calls will give different results
    public static String generateName() {
        StringBuilder name = new StringBuilder();
        // do stuff to generate name
        return name.toString();
    }
}

或者,如果您的名称生成涉及查找和提取数据库,xml文件库和/或某些外部网站或服务(无论是SOAP还是REST或其他),甚至只是解析带有列表的平面文件它中的常用名称,那么你需要更多的参与,但是调用代码隐藏了哪些参与。

public interface NameGenerator {
    // 2 consecutive calls should give same result for a given instance
    String getName();
    // Might take a while (30 seconds or more) consider wrapping in a thread and using a `Future`
    void generateName() throws NameGenerationException;
}

public class NameGeneratorImpl implements NameGenerator {
    private String name = null;
    public String getName() { return this.name; }
    public void generateName() {
        Resource resource = // for example database connection
        try {
            // this might even be broken down into multiple private methods
            // a. access resource
            StringBuilder nameBuilder = new StringBuilder();
            // b. get data from resource
            // c. use data in name formula
            this.name = nameBuilder.toString();
        } catch(ResourceException e) {
            throw new NameGenerationException(e);
        } finally {
             // free expensive resource
        }
    }
}

答案 3 :(得分:0)

您的实例变量通常是私有的,这就是为什么要创建一个getter / setter来访问它们的原因。您的getName()方法是任何类都可以调用的公共方法。你使用哪一个取决于你希望你的班级如何运作。如果类的目的是生成随机名称,您将使用Jigar的示例。

如果你的getName()函数应该检索一个人的名字(一个实例变量),那么你将使用一个getter。