繁体   English   中英

JAVA api验证/异常处理

[英]JAVA api validation/Exception handling

如何在编写Java API / Utility时处理错误条件

这是我的API接口实现

public void bin2zip(InputStream[] is,OuputStream os, String[] names)
{
   //if number of streams and number of names do not match do something 
}

我想要做的是处理一个案例,当时长度is != name长度。

我该如何处理这个问题。 我不希望我的API做一些工作,直到抛出ArrayOutOfBound异常。 我想早点抓住这个。

一种解决方案是这样的:

如果它不匹配我扔

if(is.length==names.length)
            throws new Exception("ParemeterValidationException: The inputstream array and name array length should match");
if(containsInvalidFileName(names))
            throws new Exception("ParemeterValidationException: The names array length should contain valid filenames");

此外,这可以使用DataDependency完成编译时间(我可以为API创建ValidationClass并确保开发人员获取此对象以传递给此转换API)或运行时异常是最好的方法吗?

我相信做一个ValidationClass将使API使用变得复杂

我确实经历了一些材料(如果有兴趣的话),但需要一些指导。

  1. http://lcsd05.cs.tamu.edu/slides/keynote.pdf
  2. Java:已检查vs未经检查的异常说明
  3. http://docs.oracle.com/javase/tutorial/collections/interoperability/api-design.html

只要有可能,不要让最终用户搞砸了。

public final class Bin2Zipper {
    private final List<InputStream> inputStreams = ...;
    private final List<String> names = ...;    

    public BinZipper() {
    }

    public void add(final InputStream is, final String name) {
        this.inputStreams.add(is);
        this.names.add(name);
    }

    public void bin2zip(final OutputStream os) {
        // ...
    }
}

流畅的界面甚至可能更好。 然后你的代码看起来像:

Bin2Zipper.add(is1, name1).add(is2, name2).add(is3, name3).toZip(os);

public final class Bin2Zipper {

    private final List<InputStream> inputStreams = ...;
    private final List<String> names = ...;

    private Bin2Zipper(final InputStream is, final String name) {
         this.inputStreams.add(is);
         this.names.add(name);
    }

    public static Bin2Zipper add(final InputStream is, final String name) {
         return new Bin2Zipper(is, name);
    }

    public Bin2Zipper add(final InputStream is, final String name) {
         this.inputStreams.add(is);
         this.names.add(name);
         return this;
    }

    public void zip(final OutputStream os) {
        ...
    }
}

这些倒下的地方是客户端从两个阵列开始。 在这种情况下,他们必须循环遍历所有条目本身是令人讨厌的。 我认为它仍然值得。 如果不这样做,那么您必须立即比较输入的大小。 你几乎肯定想要抛出一个未经检查的异常,可能是像Vince所说的IllegalArgumentException

我认为你比较阵列长度的解决方案是完全合适的。 我想在这种情况下你应该抛出一个IllegalArgumentException; 此异常在标准中定义,并由执行此类检查的大多数标准函数使用。

许多标准库使用这种易于理解的界面。

这就是说我认为你应该更喜欢一个简单的界面,它不会像@Eric所建议的那样滥用 - 每个人都喜欢使用的库是每次第一次使用的库,因为它太简单了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM