【问题标题】:Unique with its type? [closed]独特的类型? [关闭]
【发布时间】:2014-12-15 20:11:58
【问题描述】:

每个电话号码的类型必须唯一。它们必须存储为两个字段:电话类型(工作、家庭、手机)和号码。 我怎样才能在java中编写这样的类? 下面的contracter是真的还是假的?

public class PhoneNumber {

   private int number;
   private String type;

public PhoneNumber(int number1,String type1){

    setNumber(number1);
    setType(type1);
}

【问题讨论】:

  • 您的数据模型应该独立于用户输入的约束。最好将这种验证检查放在另一个级别(例如,当您将值插入集合或其他数据存储时)。顺便说一句 - 电话号码不是,也永远不会是一个实际的数字。
  • 类型也可以是枚举。
  • 就目前而言,这个问题没有提供足够的信息并且过于宽泛。您如何保持独特性以及如何创建新的PhoneNumbers?
  • 您在哪里确保电话号码字段的唯一性?如果它在您的设置器中,请提供它们的代码。电话号码不应存储为 int;使用字符串。
  • A PhoneNumber 及其类型和编号是一条数据。电话号码在类型中应该是唯一的,这是一个业务规则,因此该约束不属于 PhoneNumber 类。

标签: java class types unique


【解决方案1】:

你可以这样做:

public class PhoneNumber {

    private int number;
    private String type;

    public static Map<Integer, PhoneNumber> knownNumbers = new HashMap<Integer, PhoneNumber>();

    public PhoneNumber(int number1,String type1) throws AlreadyExistsNumberException{
        validate(number1);
        this.number = number1;
        this.type = type1;

        knownNumbers.put(number, this);
    }



    private void validate(int number1) {
        if(knownNumbers.get(number1) != null){
            throw new AlreadyExistsNumberException("The number "+number1+" already exists");
        }
    }
}

然后,例如:

try{
    PhoneNumber number = new PhoneNumber(66666666, "Mobile");
}catch(AlreadyExistsNumberException e){
    //Deal with the problem
}

当然有几种方法可以解决这个问题,你也可以有一个静态的方法来检查它,使用一个布尔方法来查看它是否已经存在等等......

编辑

另一种选择:

public class PhoneNumber {

    private int number;
    private String type;

    public static Map<Integer, PhoneNumber> knownNumbers = new HashMap<Integer, PhoneNumber>();

    public PhoneNumber(int number1,String type1){
        this.number = number1;
        this.type = type1;

        knownNumbers.put(number, this);
    }

    private static boolean validate(int number1) {
        return (knownNumbers.get(number1) == null);
    }
}

它的用法:

int number = 66666666;
String type = "Cell";
if(validate(number))
    PhoneNumber phoneNumber = new PhoneNumber(number, type);

【讨论】:

  • 我知道异常使用存在争议,但对我来说,如果我们基于 java 文档,它们符合问题...“异常是在执行破坏正常指令流的程序。”在我看来,这可以被认为是这种情况。
  • @Makoto 使用非异常替代编辑
【解决方案2】:

您的电话号码不应使用ints。一方面,电话号码是 10 位数字(均为正数),因此它们很容易超过 int 的容量。另一方面,电话号码不是整数......你永远不会加减或乘以电话号码。

它应该是这样的:

public enum PhoneType { ... // fill in the possible phone types
}

public static final EnumMap<PhoneType, Set<String>> phoneNumbers = new EnumMap<PhoneType, Set<String>>(); 

您可能希望围绕这些DTs 构建一些控件来获取/设置电话号码,但这应该可以帮助您开始

【讨论】:

  • 我认为这与问题无关
  • 这非常相关,因为问题本质上是“如何创建一个代表联系人电话号码的类?”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
相关资源
最近更新 更多