Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构建类和方法,Java_Java_Oop_Methods - Fatal编程技术网

构建类和方法,Java

构建类和方法,Java,java,oop,methods,Java,Oop,Methods,我一直在问这个问题,但有人把它搁置了,说在这里问更合适,所以问题是 假设我有一个应用程序,该应用程序有一个类,它从一个方法为我生成一个随机字符串,然后我从该字符串创建一个秘密 代码如下所示 public class MyRandomStringGeneratorClass { private String generatedRandomString; public String generateRandomString() { //some logic

我一直在问这个问题,但有人把它搁置了,说在这里问更合适,所以问题是

假设我有一个应用程序,该应用程序有一个类,它从一个方法为我生成一个随机字符串,然后我从该字符串创建一个秘密

代码如下所示

public class MyRandomStringGeneratorClass
{
    private String generatedRandomString;
    public String generateRandomString()
    {
        //some logic
        this.generatedRandomString = someRandomStringGenerator();
    }
    public String generateSecretFromGeneratedRandomString()
    {
        //some encryption of the String 'generatedRandomString'
    }

}



public class MainClass
{
    public static void main(String args[])
    {
        MyRandomStringGeneratorClass obj = new MyRandomStringGeneratorClass();
        String randomString = obj.generateRandomString();
        String secretFromRandomString = obj.generateSecretFromGeneratedRandomString();
    }
}
上面代码的问题是,如果API的用户没有生成随机字符串并预先调用secret generator方法,该怎么办。这将给他/她一个空指针错误,即

public class MainClass
{
    public static void main(String args[])
    {
        MyRandomStringGeneratorClass obj = new MyRandomStringGeneratorClass();
       // String randomString = obj.generateRandomString();
        String secretFromRandomString = obj.generateSecretFromGeneratedRandomString();
    }
}
我想在这种情况下,我能做的最好的事情是对字段的secret generator方法进行null检查,如果它为null,则在控制台中向用户记录一条消息,您必须首先生成一个字符串才能从该字符串中获取机密,但对我来说这似乎有点老生常谈

i、 e

我能想到的另一件事是从方法的内部调用方法
generateRandomString()
。这将确保确实生成了字符串,并对其执行了加密

public class MyRandomStringGeneratorClass
{
    private String generatedRandomString;
    private String generateRandomString()
    {
        //some logic
        this.generatedRandomString = someRandomStringGenerator();
    }
    public String generateSecretFromGeneratedRandomString()
    {
      generatedRandomString=generateRandomString(); 
    // encrypt the String now
    }

}
但是,我可能无法返回普通生成的随机字符串(如果不将字段声明为public,或者除非我为相同的字段提供getter方法)。
请建议合适的方法。询问是否需要进一步澄清

无论如何,您为什么需要向用户公开
generateRandomString
?我只想将其作为一个实现细节,并将其封装在generatedrandomstring的generateSecretFromGeneratedRandomString中:

public String generateSecretFromGeneratedRandomString() {
    if (generatedRandomString == null) {
        generatedRandomString = generateRandomString();
    }
    //some encryption of the String 'generatedRandomString'
    return encryptedString;
}

您可以试用可选的容器对象-

公共类MyRandomStringGeneratorClass
{ 
私有可选生成的随机字符串;
公共字符串生成器domstring()
{ 
//一些逻辑
this.generatedRandomString=Optional.of(someRandomStringGenerator());
返回generatedRandomString.get()
} 
公共字符串GenerateCretfromGeneratedRandomString()
{ 
if(generatedRandomString.isPresent())
{
//字符串“generatedRandomString”的某些加密
}
其他的
{
//generatedRandomString为null,您可以创建新字符串并对其进行加密
}
}
} 

这两种方法(generateRandomString和generateSecretFromGeneratedRandomString)都可以声明为public,以返回普通字符串和加密字符串。如果先前未生成随机字符串,请从GenerateCretFromGeneratedRandomString方法获取新的随机字符串。

检查GenerateCretFromGeneratedRandomString()方法中的Null值,如果该值为Null,则引发自定义异常,然后处理异常并要求用户在生成机密之前生成随机字符串。安全且简单。

一个不可变的随机字符串怎么样

public class RandomString {

    private final String randomString;
    private final String secret;

    public RandomString() {
        this.randomString = someRandomStringGenerator();
        this.secret = computeSecret(this.randomString);
    }

    public String getString() {
        return randomString;
    }

    public String getSecret() {
        return secret;
    }

}

public class MainClass {
    public static void main(String args[]) {
        final RandomString randomString = new RandomString();
        System.out.println(randomString.getString());
        System.out.println(randomString.getSecret());
    }
}

如果您希望强制执行序列,并且仍然保留覆盖两个micro方法的选项以进行覆盖,则可以使用模板方法设计模式

public class RndStringGenerator {
    private String randomString;
    public final String getSecretString() {
        generateRndString();
        return generateSecret();
    }
    public String getGeneratedRndString() {
        if (randomString == null) {
            generateRndString();
        }
        return randomString;
    }
    protected void generateRndString() {
        // some logic
        this.randomString = "Assume its Random String";
    }
    protected String generateSecret() {
        // some encryption
        return randomString;
    }
}

这是一种模板方法,它允许覆盖受保护的方法,但会锁定最终的方法覆盖以维护序列。

您已经知道如何检测这种情况。当你找到它时,该怎么办取决于你。抛出异常?很好的一点:),但我需要公开它,因为我正在数据库中保存加密数据和普通数据(请考虑它不是密码,只是加密字符串)。我认为您将给出的下一个建议是不要存储普通数据,不管它是密码还是其他什么。然而,我节省了自己的重复加密解密过程。但是您的建议非常受欢迎。这与
generatedRandomString==null
相同吗?如果您只使用库的一个函数性,而不是像这里这样容易复制的函数性,那么包含该库是否值得?可选仅适用于此用例。。Java8告诉您避免空检查和NPE。。用这个一点也不贵。
public class RandomString {

    private final String randomString;
    private final String secret;

    public RandomString() {
        this.randomString = someRandomStringGenerator();
        this.secret = computeSecret(this.randomString);
    }

    public String getString() {
        return randomString;
    }

    public String getSecret() {
        return secret;
    }

}

public class MainClass {
    public static void main(String args[]) {
        final RandomString randomString = new RandomString();
        System.out.println(randomString.getString());
        System.out.println(randomString.getSecret());
    }
}
public class RndStringGenerator {
    private String randomString;
    public final String getSecretString() {
        generateRndString();
        return generateSecret();
    }
    public String getGeneratedRndString() {
        if (randomString == null) {
            generateRndString();
        }
        return randomString;
    }
    protected void generateRndString() {
        // some logic
        this.randomString = "Assume its Random String";
    }
    protected String generateSecret() {
        // some encryption
        return randomString;
    }
}