Создать класс, объект которого не может быть создан

Я учусь на бакалавра, и мой профессор дал мне задание, он сказал: "Создать класс без использования модификатора доступа или ключевого слова интерфейса, чей объект не может быть создан".

Я прошел через Google, но не могу найти решение. Как это можно сделать на Java?

5 ответов

Решение

Перечисления - это классы ( JLS§8.9), которые не могут быть созданы и не могут быть разделены на подклассы; просто создайте его без каких-либо значений:

enum Foo {}

Другие возможности в зависимости от интерпретации:

JonK и T.J. Crowder рассмотрели возможность исключения из конструктора:

final class Example {
    Example() {
        throw new Exception();
    }
}

Но nick zoum отметил, что экземпляр все еще создается и существует, кратко, до исключения, хотя его нельзя (в примере выше) сохранить.

nick zoum считается abstract:

abstract class Example {
}

... но T.J. Crowder указал, что abstract классы могут быть разделены на подклассы (они не могут быть final), а экземпляр подкласса "является" экземпляром суперкласса.

Я не Java-человек, но другие ответы дали мне эту идею:

import java.util.*;
import java.lang.*;
import java.io.*;


class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Object o = new Problematic();

        // unreachable

    }
}

class Problematic
{
    static 
    {
        int i = 1 / 0 ;
    }
}

Попробуйте на Ideone

Я уверен, что нет никакого способа сделать Problematic и выжить...

(Обратите внимание, что когда я пытался throw new Exception(); в статическом инициализаторе он не будет компилироваться)

Вы пробовали ключевое слово abstract?

Например:

abstract class Test{}

Конечно, это может быть перезаписано, поэтому, пожалуйста, проверьте этот ответ для более надежного дизайна.

Анонимный внутренний класс должен быть ответом.

Пример:

public abstract class HelloWorld{
    abstract void x();
    public static void main(String []args){
        System.out.println("Hello World"); 
        HelloWorld h = new HelloWorld(){
            void x(){
                System.out.println(" ");
            }
        }; 
        h.x(); 
    } 
}

Класс создан, но его имя определяет компилятор, который расширяет HelloWorld класс и обеспечивает реализацию x() метод.

Не услышав точно, как ваш профессор сформулировал это, "без использования модификатора доступа" может означать, что они пытаются научить вас, как работает модификатор доступа "по умолчанию"?

В таком случае:

package mypackage.nocreate;
class MyClass {
}

А потом:

package mypackage;
import mypackage.nocreate.MyClass;

public class Test {
    public static void main(String[] args) {
        new MyClass();   // not allowed - in a different package
    }
}

Вы можете утверждать, что - по крайней мере, в исходном коде - который не использует модификатор доступа:)

Другие вопросы по тегам