জাভাতে, কখন আমাদের ইন্টারফেসগুলিতে ব্যক্তিগত উদাহরণ পদ্ধতি ব্যবহার করা উচিত?


9

জাভা 9 হিসাবে, একটি ইন্টারফেসের পদ্ধতিগুলি ব্যক্তিগত হতে পারে। একটি ব্যক্তিগত পদ্ধতি স্থির বা একটি উদাহরণ পদ্ধতি হতে পারে। যেহেতু ব্যক্তিগত পদ্ধতিগুলি কেবল ইন্টারফেসের পদ্ধতিগুলিতেই ব্যবহার করা যায়, তাই তাদের ব্যবহার ইন্টারফেসের অন্যান্য পদ্ধতির সাহায্যকারী পদ্ধতিতে সীমাবদ্ধ।

কে এস হোর্স্টম্যান, কোর জাভা ভলিউম I - মৌলিক

আমি পেয়েছি যে আমরা ব্যক্তিগত পদ্ধতিগুলিতে সাধারণ কার্যকারিতা রাখতে পারি এবং এটি জনসাধারণের কাছে অ্যাক্সেসযোগ্য করে তুলতে পারি না। তবে আমাদের এখানে দুটি ধরণের ব্যক্তিগত পদ্ধতি থাকতে পারে:

  1. private
  2. private static

ব্যবহার private staticপদ্ধতি বোধগম্য, কিন্তু যখন আমরা ব্যবহার করা উচিত privateপদ্ধতি? আমরা এখানে উদাহরণগুলির সাথে কাজ করছি না কারণ এটি একটি ইন্টারফেস, তাই কেন privateপদ্ধতি তৈরির অনুমতি দেওয়া হচ্ছে? আমাদের কি কেবল private staticপদ্ধতির দরকার নেই ?


একটি ইন্টারফেসের মধ্যে এমন পদ্ধতি অন্তর্ভুক্ত থাকতে পারে যা অন্যান্য উদাহরণ পদ্ধতি কল করে তবে তা জনসাধারণের ব্যবহারের উদ্দেশ্যে নয়।
ডেভ নিউটন

2
ইন্টারফেসটি privateপ্রয়োগ করে এমন শ্রেণিতে ইন্টারফেসের উদাহরণ পদ্ধতিতে কল করার চেষ্টা করুন ।
আবরা

1
এই জাতীয় ব্যক্তিগত পদ্ধতিটি ইন্টারফেস থেকে অন্যান্য পদ্ধতিগুলি কল করতে পারে, সুতরাং তারা private staticপদ্ধতিগুলির দ্বারা সমতুল্য বা প্রতিস্থাপনযোগ্য নয় ।
মার্ক রোটেভেল

ডিফল্ট পদ্ধতিগুলি সম্ভবত
মরিস পেরি

উত্তর:


2

ঠিক আছে, ওপির প্রশ্নের উত্তর দেওয়ার জন্য আরেকটি প্রচেষ্টা। যখন আপনাকে কোনও ব্যক্তিগত পদ্ধতি থেকে ইন্টারফেসে অন্য অ-স্থিতিশীল পদ্ধতিতে কল করার দরকার হয়, ব্যক্তিগত পদ্ধতিটি স্থিতিক হতে পারে না। উদাহরণস্বরূপ, নীচের ব্যক্তিগত পদ্ধতিটি স্থিতিশীল থাকলে সংকলনের ত্রুটি হবে:

public interface InterfaceWithMethods {
    public default void doSomething() {
        doSomethingCommon();
    }

    public default void doSomethingElse() {
        doSomethingCommon();
    }

    public void actuallyDoSomething();

    private void doSomethingCommon() {
        System.out.println("Do something first.");
        actuallyDoSomething();
    }
}

কেন এটি প্রাসঙ্গিক? আপনি "পাবলিক ডিফল্ট" হিসাবে প্রতিটি পদ্ধতি প্রয়োগ করতে পারেন। প্রশ্নটি কেন / কী উদ্দেশ্যে আপনি z বা y এর উপর বাস্তবায়ন বেছে নেবেন - তা নয় about
ফ্লোরিয়ান সালিহোভিক

2
আপনি যখন এই ব্যক্তিগত পদ্ধতি থেকে অন্য কোনও পদ্ধতি কল করার প্রয়োজন হয় তবে ফ্লোরিয়ানসালিহোভিচ আপনি স্ট্যাটিকের তুলনায় অ স্থিতি বেছে নেবেন। তাই না কেন?
জিংক্স

আপনি ভুল প্রশ্ন জিজ্ঞাসা করছেন। কীভাবে অবজেক্টগুলি একে অপরের সাথে ইন্টারঅ্যাক্ট করে তার সম্ভাবনাগুলি সংকীর্ণ বা প্রশস্ত করতে পদ্ধতির দৃশ্যমানতা বাছাই করা হয়। ডেভেলপাররা তাদের কোডটি কীভাবে ব্যবহার করা উচিত / আবশ্যক / তা ব্যবহার করা উচিত সে সম্পর্কে অভিপ্রায় জানানোর জন্য এটি গুরুত্বপূর্ণ। আপনি স্ট্যাটিক পদ্ধতিতে সমস্ত কিছু প্রয়োগ করতে পারেন বা কোনও স্থির পদ্ধতি ব্যবহার করতে পারেন না। প্রশ্নটি গুরুত্বপূর্ণ যেমন আমাদের অন্যান্য বিষয়বস্তু / শ্রেণীর কার্যকারিতা অ্যাক্সেস করার পরিণতি সম্পর্কে চিন্তা করতে হবে, যা একেবারেই অ্যাক্সেসযোগ্য হবে না।
ফ্লোরিয়ান সালিহোভিক

2
@ ফ্লোরিয়ানসালিহোভিচ তবে আমি যেমন লোকেদের মন্তব্য থেকে জানতে পেরেছি, ওপি দৃশ্যমানতা বা স্ট্যাটিক বনাম অ-স্থিতাবস্থা ব্যবহার করার বিষয়ে জিজ্ঞাসা করছিল না, পরিবর্তে তারা জিজ্ঞাসা করছিল যে ব্যক্তিগত স্ট্যাটিক আপাতদৃষ্টিতে যথেষ্ট হ'ল কেন ইন্টারফেসে স্থির বেসরকারী পদ্ধতিগুলি কেন অনুমোদিত are আমার উত্তরটি এমন একটি ব্যবহারের কেস সরবরাহ করেছে যেখানে কেবল একটি স্থিতিশীল পদ্ধতিই কাজ করবে।
জিঙ্গেক্স

3

ইন্টারফেসগুলি কোনও সামগ্রীর আচরণ সংজ্ঞায়িত করতে ব্যবহৃত হয়। এই উপায়ে সব ইন্টারফেস এর পদ্ধতি উদ্ভাসিত হয়। ডিফল্ট পদ্ধতি ব্যবহার করার সময়, আমরা শ্রেণি সীমানা জুড়ে কোড পুনরায় ব্যবহারের প্রস্তাব করে সংজ্ঞায়িত পদ্ধতিগুলির মানক প্রয়োগকরণ সরবরাহ করতে পারি।

কিছু ক্ষেত্রে, কার্যকারিতা প্রয়োজনীয় (সম্ভবত বিভিন্ন ডিফল্ট পদ্ধতিতে কেবল কোড পুনরায় ব্যবহারের জন্য ) তবে এটি প্রকাশ করা উচিত নয় কারণ এটি শ্রেণি / অবজেক্টের নামস্থান দূষিত করে would এখানেই ব্যক্তিগত ডিফল্ট পদ্ধতি কার্যকর হয়। উদাহরণস্বরূপ ব্যক্তিগত ডিফল্ট পদ্ধতিগুলি কারখানা, বৈধতা বা ডিফল্ট রাষ্ট্র পরিচালনার হতে পারে।

package com.company;

import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class Main {

  public static void main(final String[] args) {
    var messages =
        List.of(
            MessageQueue.newSubject("Message 1"),
            MessageQueue.newTopic("Message 2"),
            MessageQueue.newTopic("Message 3"));
    final MessageQueueAdapter1 queue1 = () -> messages;
    inspectQueue(queue1);
    final MessageQueueAdapter2 queue2 = () -> messages;
    inspectQueue(queue2);
  }

  private static void inspectQueue(final MessageQueue queue) {
    final List<Message> messagesWithSubject = queue.getMessagesWithSubject();
    assert messagesWithSubject.size() == 1 : "expected one message with 'Subject'";
    final List<Message> messagesWithTopic = queue.getMessagesWithTopic();
    assert messagesWithTopic.size() == 2 : "expected two message with 'Topic'";
    assert !queue.getMessages().isEmpty() && 3 == queue.getMessages().size()
        : "expected three messages in total";
  }

  @FunctionalInterface
  interface Message {
    private static boolean isPrefixedBy(final String message, final String prefix) {
      return message != null && !message.isEmpty() && message.startsWith(prefix);
    }

    default boolean hasSubject() {
      return isPrefixedBy(this.getMessage(), MessageQueue.PREFIX_SUBJECT);
    }

    default boolean hasTopic() {
      return isPrefixedBy(this.getMessage(), MessageQueue.PREFIX_TOPIC);
    }

    String getMessage();
  }

  interface MessageQueue {
    String PREFIX_SUBJECT = "Subject: ";

    String PREFIX_TOPIC = "Topic: ";

    private static Message newMessage(final String message) {
      return () -> message;
    }

    static Message newSubject(final String message) {
      return newMessage(PREFIX_SUBJECT + message);
    }

    static Message newTopic(final String message) {
      return newMessage(PREFIX_TOPIC + message);
    }

    List<Message> getMessages();

    List<Message> getMessagesWithSubject();

    List<Message> getMessagesWithTopic();
  }

  @FunctionalInterface
  interface MessageQueueAdapter1 extends MessageQueue {
    private static List<Message> filterBy(
        final List<Message> messages, final Predicate<Message> predicate) {
      return messages.stream().filter(predicate).collect(Collectors.toList());
    }

    /** {@inheritDoc} */
    @Override
    default List<Message> getMessagesWithSubject() {
      return filterBy(this.getMessages(), Message::hasSubject);
    }

    /** {@inheritDoc} */
    @Override
    default List<Message> getMessagesWithTopic() {
      return filterBy(this.getMessages(), Message::hasTopic);
    }
  }

  @FunctionalInterface
  interface MessageQueueAdapter2 extends MessageQueue {
    private List<Message> filterBy(final Predicate<Message> predicate) {
      return this.getMessages().stream().filter(predicate).collect(Collectors.toList());
    }

    /** {@inheritDoc} */
    @Override
    default List<Message> getMessagesWithSubject() {
      return filterBy(Message::hasSubject);
    }

    /** {@inheritDoc} */
    @Override
    default List<Message> getMessagesWithTopic() {
      return filterBy(Message::hasTopic);
    }
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.