【问题标题】:An error when making an interface-implementing class static将接口实现类设为静态时出错
【发布时间】:2015-12-05 16:05:31
【问题描述】:

假设我有一个如下定义的简单接口:

public interface Cipher
{
  public String encode(String original);
  public String decode(String encoded);
}

在此示例中,该接口用于创建一些表示不同基本密码的对象。一种这样的密码的工作原理是获取给定的字符串并将其逐个字符地输入到二维数组中,方法是从数组的左上角开始,并在移动到下一行之前遍历每一行。 encode 方法通过在移动到下一列之前向下读取该数组来创建编码字符串。这显示在下面的代码中:

public class TopLeftColumnRow implements Cipher
{
public TopLeftColumnRow()
{

}
public String encode(String original)
{
    String encoded = "";
    int dimension;
    int x=0;
    int y=0;
    int pos=0;
    dimension = ((int)Math.ceil(Math.pow((double)original.length(),0.5)));
    String[][] LocalBox = new String[dimension][dimension];
    for(x=0;x<dimension;x++)
    {
        for(y=0;y<dimension;y++)
        {
            try
            {
            LocalBox[x][y]=original.substring(pos,pos+1);
            pos++;
            }catch(StringIndexOutOfBoundsException ex)
            {
                LocalBox[x][y]="*";
            }//catch(StringIndexOutOfBoundsException ex)
        }//for(y=0;y<dimension;y++)
    }//for(x=0;x<dimension;x++)             

   for(y=0;y<dimension;y++)
    {
       for(x=0;x<dimension;x++)
       {
           encoded+=LocalBox[x][y];
       }//for(x=0;x<dimension;x++)
    }//for(y=0;y<dimension;y++)
    return encoded;
}//encode

public String decode(String encoded)
{

    int dimension;
    int x=0;
    int y=0;
    int pos=0;
    dimension = ((int)Math.ceil(Math.pow((double)encoded.length(),0.5)));
    String[][] LocalBox = new String[dimension][dimension];
    String decoded="";
    for(x=0;x<dimension;x++)
    {
        for(y=0;y<dimension;y++)
        {
            try
            {
            LocalBox[y][x]=encoded.substring(pos,pos+1);
            pos++;
            }catch(StringIndexOutOfBoundsException ex)
            {
                LocalBox[y][x]="*";
            }//catch(StringIndexOutOfBoundsException ex)                           
        }//for(y=0;y<dimension;y++)                
    }//for(x=0;x<dimension;x++)

    for(y=0;y<dimension;y++)
    {
        for(x=0;x<dimension;x++)
        {
            if((LocalBox[y][x].compareTo("*"))!=0)
                decoded+=LocalBox[y][x];
        }//for(x=0;x<dimension;x++)
    }//for(y=0;y<dimension;y++)
    return decoded;
}//decode
}//TopLeftColumnRow

由于加密算法每次都完全相同,并且没有存储任何属性,因此将 TopLeftColumnRow 设置为 static 类是有意义的,但是这样做是这样的:

public static class TopLeftColumnRow implements Cipher

产生错误。 Java 是否通常允许接口的静态实现,或者这是我的特定错误?我该如何解决这个问题?

【问题讨论】:

  • 一个普通的外部类默认是static,所以添加关键字没有意义。内部类可以是静态的或非静态的,因此您可以使用 statickeyword。
  • 外部类怎么可能是静态的???

标签: java arrays oop interface static


【解决方案1】:

Java 无法将顶级类设为静态,但您可以按照以下步骤创建静态类:

  • 创建类final - 防止扩展类,因为扩展静态类没有意义
  • 制作构造函数private - 阻止客户端代码实例化,因为实例化静态类没有意义
  • 声明类static的所有成员和函数 - 由于无法实例化类,因此无法调用实例方法或访问实例字段

例子:

// A top-level Java class mimicking static class behavior
public final class MyStaticClass {
    private MyStaticClass () { // private constructor
        myStaticMember = 1;
    }
    private static int myStaticMember;
    public static void setMyStaticMember(int val) {
        myStaticMember = val;
    }
    public static int getMyStaticMember() {
        return myStaticMember;
    }
    public static int squareMyStaticMember() {
        return myStaticMember * myStaticMember;
    }
}

public class TestStaticClass {
     public static void main(String []args){
        MyStaticClass.setMyStaticMember(5);
        System.out.println("Static value: " + MyStaticClass.getMyStaticMember());
        System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember());
        // MyStaticClass x = new MyStaticClass(); // results in compile time error
     }
}

静态类的一个很好的用途是定义一个实例化没有意义的类。如果 Java 允许将顶级类声明为静态,那么 Java 的 Math 类将是静态的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2012-06-14
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    相关资源
    最近更新 更多