Java:为什么声明在界面上不够用?

时间:2010-05-01 00:39:10

标签: java interface initialization declaration

Big class包含Format-interfcase和Format-class。 Format-class包含方法,接口具有字段的值。我可以在类Format中使用字段,但目标是使用Interface。那么我只是创建虚拟变量以消除错误,设计问题或ELSE?

KEY:声明VS初始化

  1. 通过术语解释,为什么你必须在接口中初始化。
  2. 背后的逻辑是什么?
  3. 它导致使用界面的哪种问题?
  4. 具有init-interface-problem的示例代码

    import java.util.*;
    import java.io.*;
    
    public class FormatBig
    {
    
            private static class Format implements Format
            {
                    private static long getSize(File f){return f.length();}
                    private static long getTime(File f){return f.lastModified();}
                    private static boolean isFile(File f){if(f.isFile()){return true;}}
                    private static boolean isBinary(File f){return Match.isBinary(f);}
                    private static char getType(File f){return Match.getTypes(f);}
                    private static String getPath(File f){return getNoErrPath(f);}
                    //Java API: isHidden, --- SYSTEM DEPENDED: toURI, toURL
    
    
                    Format(File f)
                    {
                      // PUZZLE 0: would Stack<Object> be easier?
                            size=getSize(f);
                            time=getTime(f);
                            isfile=isFile(f);
                            isBinary=isBinary(f);
                            type=getType(f);
                            path=getPath(f);
    
                        //PUZZLE 1: how can simplify the assignment?
                            values.push(size);
                            values.push(time);
                            values.push(isfile);
                            values.push(isBinary);
                            values.push(type);
                            values.push(path);
                    }
            }
    
            public static String getNoErrPath(File f)
            {
                    try{return f.getCanonicalPath();
                    }catch(Exception e){e.printStackTrace();}
            }
    
            public static final interface Format
            {
                    //ERR: IT REQUIRES "="
                    public long size;
                    public long time;
                    public boolean isFile=true;   //ERROR goes away if I initialise wit DUMMY
                    public boolean isBinary;
                    public char type;
                    public String path;
                    Stack<Object> values=new Stack<Object>();
            }
    
            public static void main(String[] args)
            {
                    Format fm=new Format(new File("."));
                    for(Object o:values){System.out.println(o);}
            }
    }
    

2 个答案:

答案 0 :(得分:6)

接口中的字段隐式public final static

static意味着他们独立于实例。这可能不是你想要的。

final表示在课程初始化期间需要分配一次,因为字段也是static。这通常意味着在声明中进行分配,但可以使用静态初始化器。如果它们是实例字段(非static),则需要在声明中,在构造函数中指定它们(隐式或显式调用super而不是“this”构造函数)或实例初始化。

您可能应该将实例字段移动到实现类中,并将它们标记为final

答案 1 :(得分:3)

@Tom已经回答了你的直接问题。基本上,您不能在接口中声明实例级属性(或类级变量)。必须在类中声明实例级属性。

如果您希望多个类共享相同的属性声明,则可以将它们放入抽象超类中。但最佳做法是将属性声明为private并通过getter和setter访问它们。

您的代码还有其他一些问题:

  • 您不能在同一名称空间中声明具有相同名称的类和接口。您有一个名为Format的类,它实现了一个名为Format的接口,这两个接口都在FormatBig的名称空间中声明。即使你可以(例如因为它们在不同的命名空间中声明),这是不好的做法。给类和接口指定不同的名称。

  • 您应该谨慎使用嵌套类。在我看来,您可能已经嵌套了Format类和FormatBig内的接口,以便您只需编辑和编译一个文件。那很懒。或者,如果您正在组织代码,请了解如何使用Java包。